From 1392e3dc2b1c0f8dd1435bbb678c5057b9dd613a Mon Sep 17 00:00:00 2001 From: karen Situ Date: Sun, 4 Apr 2021 21:52:52 -0700 Subject: [PATCH] test commit --- extern/CMakeLists.txt | 2 +- extern/png++/png++/error.hpp | 2 +- extern/sfml/.github/workflows/ci.yml | 5 +- extern/sfml/.travis.yml | 134 - extern/sfml/CMakeLists.txt | 26 +- extern/sfml/cmake/Config.cmake | 6 +- .../extlibs/headers/glad/include/glad/gl.h | 5547 +++++- .../extlibs/headers/stb_image/stb_image.h | 14949 ++++++++-------- .../headers/stb_image/stb_image_write.h | 3148 ++-- extern/sfml/include/SFML/Audio.hpp | 2 +- extern/sfml/include/SFML/Audio/AlResource.hpp | 2 +- extern/sfml/include/SFML/Audio/Export.hpp | 2 +- .../include/SFML/Audio/InputSoundFile.hpp | 2 +- extern/sfml/include/SFML/Audio/Listener.hpp | 2 +- extern/sfml/include/SFML/Audio/Music.hpp | 2 +- .../include/SFML/Audio/OutputSoundFile.hpp | 2 +- extern/sfml/include/SFML/Audio/Sound.hpp | 2 +- .../sfml/include/SFML/Audio/SoundBuffer.hpp | 2 +- .../SFML/Audio/SoundBufferRecorder.hpp | 2 +- .../include/SFML/Audio/SoundFileFactory.hpp | 2 +- .../include/SFML/Audio/SoundFileFactory.inl | 2 +- .../include/SFML/Audio/SoundFileReader.hpp | 2 +- .../include/SFML/Audio/SoundFileWriter.hpp | 2 +- .../sfml/include/SFML/Audio/SoundRecorder.hpp | 2 +- .../sfml/include/SFML/Audio/SoundSource.hpp | 2 +- .../sfml/include/SFML/Audio/SoundStream.hpp | 2 +- extern/sfml/include/SFML/Config.hpp | 7 +- extern/sfml/include/SFML/GpuPreference.hpp | 2 +- extern/sfml/include/SFML/Graphics.hpp | 2 +- .../sfml/include/SFML/Graphics/BlendMode.hpp | 12 +- .../include/SFML/Graphics/CircleShape.hpp | 2 +- extern/sfml/include/SFML/Graphics/Color.hpp | 2 +- .../include/SFML/Graphics/ConvexShape.hpp | 2 +- .../sfml/include/SFML/Graphics/Drawable.hpp | 2 +- extern/sfml/include/SFML/Graphics/Export.hpp | 2 +- extern/sfml/include/SFML/Graphics/Font.hpp | 4 +- extern/sfml/include/SFML/Graphics/Glsl.hpp | 2 +- extern/sfml/include/SFML/Graphics/Glsl.inl | 2 +- extern/sfml/include/SFML/Graphics/Glyph.hpp | 4 +- extern/sfml/include/SFML/Graphics/Image.hpp | 20 +- .../include/SFML/Graphics/PrimitiveType.hpp | 2 +- extern/sfml/include/SFML/Graphics/Rect.hpp | 2 +- extern/sfml/include/SFML/Graphics/Rect.inl | 2 +- .../include/SFML/Graphics/RectangleShape.hpp | 2 +- .../include/SFML/Graphics/RenderStates.hpp | 2 +- .../include/SFML/Graphics/RenderTarget.hpp | 2 +- .../include/SFML/Graphics/RenderTexture.hpp | 2 +- .../include/SFML/Graphics/RenderWindow.hpp | 2 +- extern/sfml/include/SFML/Graphics/Shader.hpp | 2 +- extern/sfml/include/SFML/Graphics/Shape.hpp | 2 +- extern/sfml/include/SFML/Graphics/Sprite.hpp | 2 +- extern/sfml/include/SFML/Graphics/Text.hpp | 2 +- extern/sfml/include/SFML/Graphics/Texture.hpp | 2 +- .../sfml/include/SFML/Graphics/Transform.hpp | 2 +- .../include/SFML/Graphics/Transformable.hpp | 2 +- extern/sfml/include/SFML/Graphics/Vertex.hpp | 2 +- .../include/SFML/Graphics/VertexArray.hpp | 2 +- .../include/SFML/Graphics/VertexBuffer.hpp | 2 +- extern/sfml/include/SFML/Graphics/View.hpp | 2 +- extern/sfml/include/SFML/Main.hpp | 2 +- extern/sfml/include/SFML/Network.hpp | 2 +- extern/sfml/include/SFML/Network/Export.hpp | 2 +- extern/sfml/include/SFML/Network/Ftp.hpp | 2 +- extern/sfml/include/SFML/Network/Http.hpp | 2 +- .../sfml/include/SFML/Network/IpAddress.hpp | 2 +- extern/sfml/include/SFML/Network/Packet.hpp | 2 +- extern/sfml/include/SFML/Network/Socket.hpp | 2 +- .../include/SFML/Network/SocketHandle.hpp | 2 +- .../include/SFML/Network/SocketSelector.hpp | 2 +- .../sfml/include/SFML/Network/TcpListener.hpp | 2 +- .../sfml/include/SFML/Network/TcpSocket.hpp | 2 +- .../sfml/include/SFML/Network/UdpSocket.hpp | 2 +- extern/sfml/include/SFML/OpenGL.hpp | 4 +- extern/sfml/include/SFML/System.hpp | 2 +- extern/sfml/include/SFML/System/Clock.hpp | 2 +- extern/sfml/include/SFML/System/Err.hpp | 2 +- extern/sfml/include/SFML/System/Export.hpp | 2 +- .../include/SFML/System/FileInputStream.hpp | 2 +- .../sfml/include/SFML/System/InputStream.hpp | 2 +- extern/sfml/include/SFML/System/Lock.hpp | 2 +- .../include/SFML/System/MemoryInputStream.hpp | 2 +- extern/sfml/include/SFML/System/Mutex.hpp | 2 +- .../include/SFML/System/NativeActivity.hpp | 2 +- .../sfml/include/SFML/System/NonCopyable.hpp | 2 +- extern/sfml/include/SFML/System/Sleep.hpp | 2 +- extern/sfml/include/SFML/System/String.hpp | 2 +- extern/sfml/include/SFML/System/String.inl | 2 +- extern/sfml/include/SFML/System/Thread.hpp | 2 +- extern/sfml/include/SFML/System/Thread.inl | 2 +- .../sfml/include/SFML/System/ThreadLocal.hpp | 2 +- .../include/SFML/System/ThreadLocalPtr.hpp | 2 +- .../include/SFML/System/ThreadLocalPtr.inl | 2 +- extern/sfml/include/SFML/System/Time.hpp | 2 +- extern/sfml/include/SFML/System/Utf.hpp | 2 +- extern/sfml/include/SFML/System/Utf.inl | 18 +- extern/sfml/include/SFML/System/Vector2.hpp | 2 +- extern/sfml/include/SFML/System/Vector2.inl | 2 +- extern/sfml/include/SFML/System/Vector3.hpp | 2 +- extern/sfml/include/SFML/System/Vector3.inl | 2 +- extern/sfml/include/SFML/Window.hpp | 2 +- extern/sfml/include/SFML/Window/Clipboard.hpp | 2 +- extern/sfml/include/SFML/Window/Context.hpp | 2 +- .../include/SFML/Window/ContextSettings.hpp | 2 +- extern/sfml/include/SFML/Window/Cursor.hpp | 20 +- extern/sfml/include/SFML/Window/Event.hpp | 2 +- extern/sfml/include/SFML/Window/Export.hpp | 2 +- .../sfml/include/SFML/Window/GlResource.hpp | 2 +- extern/sfml/include/SFML/Window/Joystick.hpp | 2 +- extern/sfml/include/SFML/Window/Keyboard.hpp | 2 +- extern/sfml/include/SFML/Window/Mouse.hpp | 2 +- extern/sfml/include/SFML/Window/Sensor.hpp | 2 +- extern/sfml/include/SFML/Window/Touch.hpp | 2 +- extern/sfml/include/SFML/Window/VideoMode.hpp | 2 +- extern/sfml/include/SFML/Window/Vulkan.hpp | 2 +- extern/sfml/include/SFML/Window/Window.hpp | 2 +- .../sfml/include/SFML/Window/WindowBase.hpp | 2 +- .../sfml/include/SFML/Window/WindowHandle.hpp | 4 +- .../sfml/include/SFML/Window/WindowStyle.hpp | 2 +- extern/sfml/include/SFML/test.h | 3 - extern/sfml/license.md | 2 +- extern/sfml/src/SFML/Audio/ALCheck.cpp | 2 +- extern/sfml/src/SFML/Audio/ALCheck.hpp | 2 +- extern/sfml/src/SFML/Audio/AlResource.cpp | 2 +- extern/sfml/src/SFML/Audio/AudioDevice.cpp | 2 +- extern/sfml/src/SFML/Audio/AudioDevice.hpp | 2 +- extern/sfml/src/SFML/Audio/InputSoundFile.cpp | 8 +- extern/sfml/src/SFML/Audio/Listener.cpp | 2 +- extern/sfml/src/SFML/Audio/Music.cpp | 2 +- .../sfml/src/SFML/Audio/OutputSoundFile.cpp | 2 +- extern/sfml/src/SFML/Audio/Sound.cpp | 6 +- extern/sfml/src/SFML/Audio/SoundBuffer.cpp | 2 +- .../src/SFML/Audio/SoundBufferRecorder.cpp | 2 +- .../sfml/src/SFML/Audio/SoundFileFactory.cpp | 2 +- .../src/SFML/Audio/SoundFileReaderFlac.cpp | 2 +- .../src/SFML/Audio/SoundFileReaderFlac.hpp | 2 +- .../src/SFML/Audio/SoundFileReaderOgg.cpp | 2 +- .../src/SFML/Audio/SoundFileReaderOgg.hpp | 2 +- .../src/SFML/Audio/SoundFileReaderWav.cpp | 2 +- .../src/SFML/Audio/SoundFileReaderWav.hpp | 2 +- .../src/SFML/Audio/SoundFileWriterFlac.cpp | 4 +- .../src/SFML/Audio/SoundFileWriterFlac.hpp | 2 +- .../src/SFML/Audio/SoundFileWriterOgg.cpp | 4 +- .../src/SFML/Audio/SoundFileWriterOgg.hpp | 2 +- .../src/SFML/Audio/SoundFileWriterWav.cpp | 4 +- .../src/SFML/Audio/SoundFileWriterWav.hpp | 2 +- extern/sfml/src/SFML/Audio/SoundRecorder.cpp | 2 +- extern/sfml/src/SFML/Audio/SoundSource.cpp | 2 +- extern/sfml/src/SFML/Audio/SoundStream.cpp | 2 +- extern/sfml/src/SFML/Graphics/BlendMode.cpp | 8 +- extern/sfml/src/SFML/Graphics/CMakeLists.txt | 6 + extern/sfml/src/SFML/Graphics/CircleShape.cpp | 2 +- extern/sfml/src/SFML/Graphics/Color.cpp | 2 +- extern/sfml/src/SFML/Graphics/ConvexShape.cpp | 2 +- extern/sfml/src/SFML/Graphics/Font.cpp | 27 +- extern/sfml/src/SFML/Graphics/GLCheck.cpp | 2 +- extern/sfml/src/SFML/Graphics/GLCheck.hpp | 2 +- .../sfml/src/SFML/Graphics/GLExtensions.cpp | 2 +- .../sfml/src/SFML/Graphics/GLExtensions.hpp | 31 +- extern/sfml/src/SFML/Graphics/Glsl.cpp | 2 +- extern/sfml/src/SFML/Graphics/Image.cpp | 8 +- extern/sfml/src/SFML/Graphics/ImageLoader.cpp | 51 +- extern/sfml/src/SFML/Graphics/ImageLoader.hpp | 15 +- .../sfml/src/SFML/Graphics/RectangleShape.cpp | 2 +- .../sfml/src/SFML/Graphics/RenderStates.cpp | 2 +- .../sfml/src/SFML/Graphics/RenderTarget.cpp | 43 +- .../sfml/src/SFML/Graphics/RenderTexture.cpp | 2 +- .../src/SFML/Graphics/RenderTextureImpl.cpp | 2 +- .../src/SFML/Graphics/RenderTextureImpl.hpp | 2 +- .../Graphics/RenderTextureImplDefault.cpp | 2 +- .../Graphics/RenderTextureImplDefault.hpp | 2 +- .../SFML/Graphics/RenderTextureImplFBO.cpp | 2 +- .../SFML/Graphics/RenderTextureImplFBO.hpp | 2 +- .../sfml/src/SFML/Graphics/RenderWindow.cpp | 2 +- extern/sfml/src/SFML/Graphics/Shader.cpp | 4 +- extern/sfml/src/SFML/Graphics/Shape.cpp | 2 +- extern/sfml/src/SFML/Graphics/Sprite.cpp | 13 +- extern/sfml/src/SFML/Graphics/Text.cpp | 6 +- extern/sfml/src/SFML/Graphics/Texture.cpp | 2 +- .../sfml/src/SFML/Graphics/TextureSaver.cpp | 2 +- .../sfml/src/SFML/Graphics/TextureSaver.hpp | 2 +- extern/sfml/src/SFML/Graphics/Transform.cpp | 2 +- .../sfml/src/SFML/Graphics/Transformable.cpp | 2 +- extern/sfml/src/SFML/Graphics/Vertex.cpp | 2 +- extern/sfml/src/SFML/Graphics/VertexArray.cpp | 2 +- .../sfml/src/SFML/Graphics/VertexBuffer.cpp | 2 +- extern/sfml/src/SFML/Graphics/View.cpp | 2 +- extern/sfml/src/SFML/Main/MainAndroid.cpp | 3 +- extern/sfml/src/SFML/Main/MainWin32.cpp | 2 +- extern/sfml/src/SFML/Main/MainiOS.mm | 2 +- extern/sfml/src/SFML/Network/Ftp.cpp | 4 +- extern/sfml/src/SFML/Network/Http.cpp | 4 +- extern/sfml/src/SFML/Network/IpAddress.cpp | 2 +- extern/sfml/src/SFML/Network/Packet.cpp | 28 +- extern/sfml/src/SFML/Network/Socket.cpp | 2 +- extern/sfml/src/SFML/Network/SocketImpl.hpp | 2 +- .../sfml/src/SFML/Network/SocketSelector.cpp | 2 +- extern/sfml/src/SFML/Network/TcpListener.cpp | 2 +- extern/sfml/src/SFML/Network/TcpSocket.cpp | 2 +- extern/sfml/src/SFML/Network/UdpSocket.cpp | 2 +- .../sfml/src/SFML/Network/Unix/SocketImpl.cpp | 2 +- .../sfml/src/SFML/Network/Unix/SocketImpl.hpp | 2 +- .../src/SFML/Network/Win32/SocketImpl.cpp | 2 +- .../src/SFML/Network/Win32/SocketImpl.hpp | 2 +- .../sfml/src/SFML/System/Android/Activity.cpp | 2 +- .../SFML/System/Android/NativeActivity.cpp | 2 +- extern/sfml/src/SFML/System/Clock.cpp | 2 +- extern/sfml/src/SFML/System/Err.cpp | 2 +- .../sfml/src/SFML/System/FileInputStream.cpp | 2 +- extern/sfml/src/SFML/System/Lock.cpp | 2 +- .../src/SFML/System/MemoryInputStream.cpp | 2 +- extern/sfml/src/SFML/System/Mutex.cpp | 2 +- extern/sfml/src/SFML/System/Sleep.cpp | 2 +- extern/sfml/src/SFML/System/String.cpp | 2 +- extern/sfml/src/SFML/System/Thread.cpp | 2 +- extern/sfml/src/SFML/System/ThreadLocal.cpp | 2 +- extern/sfml/src/SFML/System/Time.cpp | 2 +- .../sfml/src/SFML/System/Unix/ClockImpl.cpp | 2 +- .../sfml/src/SFML/System/Unix/ClockImpl.hpp | 2 +- .../sfml/src/SFML/System/Unix/MutexImpl.cpp | 2 +- .../sfml/src/SFML/System/Unix/MutexImpl.hpp | 2 +- .../sfml/src/SFML/System/Unix/SleepImpl.cpp | 2 +- .../sfml/src/SFML/System/Unix/SleepImpl.hpp | 2 +- .../sfml/src/SFML/System/Unix/ThreadImpl.cpp | 2 +- .../sfml/src/SFML/System/Unix/ThreadImpl.hpp | 2 +- .../src/SFML/System/Unix/ThreadLocalImpl.cpp | 2 +- .../src/SFML/System/Unix/ThreadLocalImpl.hpp | 2 +- .../sfml/src/SFML/System/Win32/ClockImpl.cpp | 2 +- .../sfml/src/SFML/System/Win32/ClockImpl.hpp | 2 +- .../sfml/src/SFML/System/Win32/MutexImpl.cpp | 2 +- .../sfml/src/SFML/System/Win32/MutexImpl.hpp | 2 +- .../sfml/src/SFML/System/Win32/SleepImpl.cpp | 2 +- .../sfml/src/SFML/System/Win32/SleepImpl.hpp | 2 +- .../sfml/src/SFML/System/Win32/ThreadImpl.cpp | 2 +- .../sfml/src/SFML/System/Win32/ThreadImpl.hpp | 2 +- .../src/SFML/System/Win32/ThreadLocalImpl.cpp | 2 +- .../src/SFML/System/Win32/ThreadLocalImpl.hpp | 2 +- .../src/SFML/Window/Android/ClipboardImpl.cpp | 2 +- .../src/SFML/Window/Android/ClipboardImpl.hpp | 2 +- .../src/SFML/Window/Android/CursorImpl.cpp | 2 +- .../src/SFML/Window/Android/CursorImpl.hpp | 2 +- .../src/SFML/Window/Android/SensorImpl.cpp | 2 +- .../src/SFML/Window/Android/SensorImpl.hpp | 2 +- .../SFML/Window/Android/WindowImplAndroid.cpp | 3 +- extern/sfml/src/SFML/Window/CMakeLists.txt | 11 +- extern/sfml/src/SFML/Window/Clipboard.cpp | 2 +- extern/sfml/src/SFML/Window/ClipboardImpl.hpp | 4 +- extern/sfml/src/SFML/Window/Context.cpp | 2 +- extern/sfml/src/SFML/Window/Cursor.cpp | 2 +- extern/sfml/src/SFML/Window/CursorImpl.hpp | 4 +- .../src/SFML/Window/FreeBSD/JoystickImpl.cpp | 2 +- .../src/SFML/Window/FreeBSD/JoystickImpl.hpp | 2 +- extern/sfml/src/SFML/Window/GlContext.cpp | 4 +- extern/sfml/src/SFML/Window/GlContext.hpp | 2 +- extern/sfml/src/SFML/Window/GlResource.cpp | 2 +- extern/sfml/src/SFML/Window/InputImpl.hpp | 4 +- extern/sfml/src/SFML/Window/Joystick.cpp | 2 +- extern/sfml/src/SFML/Window/JoystickImpl.hpp | 6 +- .../sfml/src/SFML/Window/JoystickManager.cpp | 2 +- .../sfml/src/SFML/Window/JoystickManager.hpp | 2 +- extern/sfml/src/SFML/Window/Keyboard.cpp | 2 +- extern/sfml/src/SFML/Window/Mouse.cpp | 2 +- .../SFML/Window/OSX/AutoreleasePoolWrapper.h | 2 +- .../SFML/Window/OSX/AutoreleasePoolWrapper.mm | 2 +- .../src/SFML/Window/OSX/ClipboardImpl.hpp | 2 +- .../sfml/src/SFML/Window/OSX/ClipboardImpl.mm | 2 +- .../sfml/src/SFML/Window/OSX/CursorImpl.hpp | 2 +- extern/sfml/src/SFML/Window/OSX/CursorImpl.mm | 10 +- .../src/SFML/Window/OSX/HIDInputManager.hpp | 2 +- .../src/SFML/Window/OSX/HIDInputManager.mm | 2 +- .../SFML/Window/OSX/HIDJoystickManager.cpp | 2 +- .../SFML/Window/OSX/HIDJoystickManager.hpp | 2 +- extern/sfml/src/SFML/Window/OSX/InputImpl.hpp | 2 +- extern/sfml/src/SFML/Window/OSX/InputImpl.mm | 2 +- .../sfml/src/SFML/Window/OSX/JoystickImpl.cpp | 2 +- .../sfml/src/SFML/Window/OSX/JoystickImpl.hpp | 2 +- extern/sfml/src/SFML/Window/OSX/NSImage+raw.h | 2 +- .../sfml/src/SFML/Window/OSX/NSImage+raw.mm | 2 +- .../sfml/src/SFML/Window/OSX/SFApplication.h | 2 +- .../sfml/src/SFML/Window/OSX/SFApplication.m | 2 +- .../SFML/Window/OSX/SFApplicationDelegate.h | 2 +- .../SFML/Window/OSX/SFApplicationDelegate.m | 2 +- extern/sfml/src/SFML/Window/OSX/SFContext.hpp | 2 +- extern/sfml/src/SFML/Window/OSX/SFContext.mm | 2 +- .../Window/OSX/SFKeyboardModifiersHelper.h | 2 +- .../Window/OSX/SFKeyboardModifiersHelper.mm | 2 +- .../SFML/Window/OSX/SFOpenGLView+keyboard.mm | 2 +- .../Window/OSX/SFOpenGLView+keyboard_priv.h | 2 +- .../src/SFML/Window/OSX/SFOpenGLView+mouse.mm | 2 +- .../SFML/Window/OSX/SFOpenGLView+mouse_priv.h | 2 +- .../sfml/src/SFML/Window/OSX/SFOpenGLView.h | 2 +- .../sfml/src/SFML/Window/OSX/SFOpenGLView.mm | 2 +- .../src/SFML/Window/OSX/SFSilentResponder.h | 2 +- .../src/SFML/Window/OSX/SFSilentResponder.m | 2 +- .../src/SFML/Window/OSX/SFViewController.h | 2 +- .../src/SFML/Window/OSX/SFViewController.mm | 2 +- extern/sfml/src/SFML/Window/OSX/SFWindow.h | 2 +- extern/sfml/src/SFML/Window/OSX/SFWindow.m | 2 +- .../src/SFML/Window/OSX/SFWindowController.h | 2 +- .../src/SFML/Window/OSX/SFWindowController.mm | 4 +- extern/sfml/src/SFML/Window/OSX/Scaling.h | 2 +- .../sfml/src/SFML/Window/OSX/SensorImpl.cpp | 2 +- .../sfml/src/SFML/Window/OSX/SensorImpl.hpp | 2 +- .../src/SFML/Window/OSX/VideoModeImpl.cpp | 2 +- .../src/SFML/Window/OSX/WindowImplCocoa.hpp | 2 +- .../src/SFML/Window/OSX/WindowImplCocoa.mm | 2 +- .../Window/OSX/WindowImplDelegateProtocol.h | 2 +- .../src/SFML/Window/OSX/cg_sf_conversion.hpp | 2 +- .../src/SFML/Window/OSX/cg_sf_conversion.mm | 2 +- .../src/SFML/Window/OSX/cpp_objc_conversion.h | 2 +- .../SFML/Window/OSX/cpp_objc_conversion.mm | 2 +- extern/sfml/src/SFML/Window/Sensor.cpp | 2 +- extern/sfml/src/SFML/Window/SensorImpl.hpp | 4 +- extern/sfml/src/SFML/Window/SensorManager.cpp | 2 +- extern/sfml/src/SFML/Window/SensorManager.hpp | 2 +- extern/sfml/src/SFML/Window/Touch.cpp | 2 +- .../src/SFML/Window/Unix/ClipboardImpl.cpp | 2 +- .../src/SFML/Window/Unix/ClipboardImpl.hpp | 2 +- .../sfml/src/SFML/Window/Unix/CursorImpl.cpp | 30 +- .../sfml/src/SFML/Window/Unix/CursorImpl.hpp | 2 +- extern/sfml/src/SFML/Window/Unix/Display.cpp | 2 +- extern/sfml/src/SFML/Window/Unix/Display.hpp | 2 +- .../sfml/src/SFML/Window/Unix/GlxContext.cpp | 2 +- .../sfml/src/SFML/Window/Unix/GlxContext.hpp | 2 +- .../sfml/src/SFML/Window/Unix/InputImpl.cpp | 2 +- .../sfml/src/SFML/Window/Unix/InputImpl.hpp | 2 +- .../src/SFML/Window/Unix/JoystickImpl.cpp | 2 +- .../src/SFML/Window/Unix/JoystickImpl.hpp | 2 +- .../sfml/src/SFML/Window/Unix/SensorImpl.cpp | 2 +- .../sfml/src/SFML/Window/Unix/SensorImpl.hpp | 2 +- .../src/SFML/Window/Unix/VideoModeImpl.cpp | 2 +- .../src/SFML/Window/Unix/VulkanImplX11.cpp | 2 +- .../src/SFML/Window/Unix/VulkanImplX11.hpp | 2 +- .../src/SFML/Window/Unix/WindowImplX11.cpp | 4 +- .../src/SFML/Window/Unix/WindowImplX11.hpp | 2 +- extern/sfml/src/SFML/Window/VideoMode.cpp | 2 +- extern/sfml/src/SFML/Window/VideoModeImpl.hpp | 2 +- extern/sfml/src/SFML/Window/Vulkan.cpp | 4 +- .../src/SFML/Window/Win32/ClipboardImpl.cpp | 2 +- .../src/SFML/Window/Win32/ClipboardImpl.hpp | 2 +- .../sfml/src/SFML/Window/Win32/CursorImpl.cpp | 10 +- .../sfml/src/SFML/Window/Win32/CursorImpl.hpp | 2 +- .../sfml/src/SFML/Window/Win32/InputImpl.cpp | 2 +- .../sfml/src/SFML/Window/Win32/InputImpl.hpp | 2 +- .../src/SFML/Window/Win32/JoystickImpl.cpp | 48 +- .../src/SFML/Window/Win32/JoystickImpl.hpp | 2 +- .../sfml/src/SFML/Window/Win32/SensorImpl.cpp | 2 +- .../sfml/src/SFML/Window/Win32/SensorImpl.hpp | 2 +- .../src/SFML/Window/Win32/VideoModeImpl.cpp | 2 +- .../src/SFML/Window/Win32/VulkanImplWin32.cpp | 2 +- .../src/SFML/Window/Win32/VulkanImplWin32.hpp | 2 +- .../sfml/src/SFML/Window/Win32/WglContext.cpp | 2 +- .../sfml/src/SFML/Window/Win32/WglContext.hpp | 2 +- .../src/SFML/Window/Win32/WindowImplWin32.cpp | 7 +- .../src/SFML/Window/Win32/WindowImplWin32.hpp | 2 +- extern/sfml/src/SFML/Window/Window.cpp | 2 +- extern/sfml/src/SFML/Window/WindowBase.cpp | 2 +- extern/sfml/src/SFML/Window/WindowImpl.cpp | 7 +- extern/sfml/src/SFML/Window/WindowImpl.hpp | 2 +- .../src/SFML/Window/iOS/ClipboardImpl.hpp | 2 +- .../sfml/src/SFML/Window/iOS/ClipboardImpl.mm | 2 +- .../sfml/src/SFML/Window/iOS/CursorImpl.cpp | 2 +- .../sfml/src/SFML/Window/iOS/CursorImpl.hpp | 2 +- .../sfml/src/SFML/Window/iOS/EaglContext.hpp | 2 +- .../sfml/src/SFML/Window/iOS/EaglContext.mm | 2 +- extern/sfml/src/SFML/Window/iOS/InputImpl.hpp | 2 +- extern/sfml/src/SFML/Window/iOS/InputImpl.mm | 2 +- .../sfml/src/SFML/Window/iOS/JoystickImpl.hpp | 2 +- .../sfml/src/SFML/Window/iOS/JoystickImpl.mm | 2 +- extern/sfml/src/SFML/Window/iOS/ObjCType.hpp | 2 +- .../src/SFML/Window/iOS/SFAppDelegate.hpp | 2 +- .../sfml/src/SFML/Window/iOS/SFAppDelegate.mm | 2 +- extern/sfml/src/SFML/Window/iOS/SFMain.hpp | 2 +- extern/sfml/src/SFML/Window/iOS/SFMain.mm | 2 +- extern/sfml/src/SFML/Window/iOS/SFView.hpp | 2 +- extern/sfml/src/SFML/Window/iOS/SFView.mm | 2 +- .../src/SFML/Window/iOS/SFViewController.hpp | 2 +- .../src/SFML/Window/iOS/SFViewController.mm | 2 +- .../sfml/src/SFML/Window/iOS/SensorImpl.hpp | 2 +- extern/sfml/src/SFML/Window/iOS/SensorImpl.mm | 2 +- .../sfml/src/SFML/Window/iOS/VideoModeImpl.mm | 2 +- .../src/SFML/Window/iOS/WindowImplUIKit.hpp | 2 +- .../src/SFML/Window/iOS/WindowImplUIKit.mm | 2 +- extern/sfml/test.cpp | 9 - .../SFML/SFML App.xctemplate/ResourcePath.hpp | 2 +- .../SFML/SFML App.xctemplate/ResourcePath.mm | 2 +- .../SFML App.xctemplate/TemplateInfo.plist.in | 20 +- .../SFML/SFML App.xctemplate/cute_image.jpg | Bin 142959 -> 0 bytes .../SFML/SFML App.xctemplate/main.cpp | 6 +- .../SFML/SFML App.xctemplate/nice_music.ogg | Bin 153776 -> 0 bytes .../SFML/SFML App.xctemplate/sansation.ttf | Bin 28912 -> 0 bytes .../SFML Base.xctemplate/TemplateInfo.plist | 2 +- .../SFML Bundle.xctemplate/TemplateInfo.plist | 2 +- .../SFML CLT.xctemplate/TemplateInfo.plist | 20 +- .../SFML/SFML CLT.xctemplate/cute_image.jpg | Bin 142959 -> 0 bytes .../SFML/SFML CLT.xctemplate/main.cpp | 8 +- .../SFML/SFML CLT.xctemplate/nice_music.ogg | Bin 153776 -> 0 bytes .../SFML/SFML CLT.xctemplate/sansation.ttf | Bin 28912 -> 0 bytes .../TemplateInfo.plist.in | 2 +- .../SFML Linker.xctemplate/TemplateInfo.plist | 2 +- extern/sfml/tools/xcode/templates/readme.txt | 5 +- source/display.h | 2 +- source/image.h | 2 +- source/pixeller.cpp | 13 +- 403 files changed, 15201 insertions(+), 9904 deletions(-) delete mode 100644 extern/sfml/.travis.yml delete mode 100644 extern/sfml/include/SFML/test.h delete mode 100644 extern/sfml/test.cpp delete mode 100644 extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/cute_image.jpg delete mode 100644 extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/nice_music.ogg delete mode 100644 extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/sansation.ttf delete mode 100644 extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/cute_image.jpg delete mode 100644 extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/nice_music.ogg delete mode 100644 extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/sansation.ttf diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index bce76ba..3ada5ec 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required (VERSION 3.16) add_subdirectory(zlib-1.2.11) set(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/zlib-1.2.11 ${CMAKE_CURRENT_SOURCE_DIR}/zlib-1.2.11) -set(ZLIB_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/zlib-1.2.11/libz.a) +set(ZLIB_LIBRARY ${CMAKE_CURRENT_BINARY_DIR}/zlib-1.2.11/Debug/zlibstaticd.lib) set(PNG_BUILD_ZLIB ON CACHE BOOL "" FORCE) add_subdirectory(lpng1637) diff --git a/extern/png++/png++/error.hpp b/extern/png++/png++/error.hpp index 91cbd0b..f2623bd 100644 --- a/extern/png++/png++/error.hpp +++ b/extern/png++/png++/error.hpp @@ -100,7 +100,7 @@ namespace png // return std::string(buf); #undef ERRBUF_SIZE - } + return "uwu";} }; } // namespace png diff --git a/extern/sfml/.github/workflows/ci.yml b/extern/sfml/.github/workflows/ci.yml index cd0ee3d..fc0280f 100644 --- a/extern/sfml/.github/workflows/ci.yml +++ b/extern/sfml/.github/workflows/ci.yml @@ -8,6 +8,7 @@ jobs: runs-on: ${{ matrix.platform.os }} strategy: + fail-fast: false matrix: platform: - { name: Windows VS2017, os: windows-2016 } @@ -34,7 +35,7 @@ jobs: - name: Install Linux Dependencies if: runner.os == 'Linux' - run: sudo apt-get install libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev + run: sudo apt-get update && sudo apt-get install libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev - name: Install Android Components @@ -43,7 +44,7 @@ jobs: echo "y" | /usr/local/lib/android/sdk/tools/bin/sdkmanager --install "cmake;3.10.2.4988404" --sdk_root=ANDROID_SDK_ROOT sudo ln -sf /usr/local/lib/android/sdk/cmake/3.10.2.4988404/bin/cmake /usr/bin/cmake wget -nv https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip -P $GITHUB_WORKSPACE - unzip -qq -d $GITHUB_WORKSPACE android-ndk-r18b-linux-x86_64.zip + unzip -qq -d $GITHUB_WORKSPACE android-ndk-r18b-linux-x86_64.zip - name: Configure CMake diff --git a/extern/sfml/.travis.yml b/extern/sfml/.travis.yml deleted file mode 100644 index 953ae09..0000000 --- a/extern/sfml/.travis.yml +++ /dev/null @@ -1,134 +0,0 @@ -language: cpp - -addons: - apt_packages: - - cmake - - libxrandr-dev - - libxcursor-dev - - libudev-dev - - libopenal-dev - - libflac-dev - - libvorbis-dev - - g++ - - clang - - libgl1-mesa-dev - -before_script: -- mkdir build && cd build -- cmake .. $CMAKE_FLAGS -DCMAKE_INSTALL_PREFIX=../install -DSFML_BUILD_EXAMPLES=TRUE -DCMAKE_VERBOSE_MAKEFILE=ON - -script: -- cmake --build . --target install - -matrix: - include: - - - name: "Linux gcc Dynamic" - os: linux - dist: xenial - compiler: gcc - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - - - name: "Linux gcc Static" - os: linux - dist: xenial - compiler: gcc - env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - - - name: "Linux clang Dynamic" - os: linux - dist: xenial - compiler: clang - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - - - name: "Linux clang Static" - os: linux - dist: xenial - compiler: clang - env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - - - name: "macOS Xcode 10 Dynamic" - os: osx - osx_image: xcode10 - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE" - - - name: "macOS Xcode 10 Frameworks" - os: osx - osx_image: xcode10 - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE -DSFML_BUILD_FRAMEWORKS=TRUE" - - - name: "macOS Xcode 10 Static" - os: osx - osx_image: xcode10 - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=TRUE -DBUILD_SHARED_LIBS=FALSE" - - - name: "iOS Xcode 10" - os: osx - osx_image: xcode10 - env: - - CMAKE_FLAGS="-GXcode -DSFML_BUILD_TEST_SUITE=TRUE -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/iOS.toolchain.cmake -DIOS_PLATFORM=SIMULATOR" - - - name: "Visual Studio 15 2017 Dynamic" - os: windows - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=FALSE" - - - name: "Visual Studio 15 2017 Static" - os: windows - env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - - - name: "Visual Studio 16 2019 Dynamic" - os: windows - env: - - CMAKE_FLAGS="-DSFML_BUILD_TEST_SUITE=FALSE" - - MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin" - - VS160COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools" - - PATH=$MSBUILD_PATH:$PATH - install: - - choco install visualstudio2019buildtools --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64" - - choco install visualstudio2019-workload-nativedesktop - - - name: "Visual Studio 16 2019 Static" - os: windows - env: - - CMAKE_FLAGS="-DBUILD_SHARED_LIBS=FALSE -DSFML_BUILD_TEST_SUITE=TRUE" - - MSBUILD_PATH="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin" - - VS160COMNTOOLS="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools" - - PATH=$MSBUILD_PATH:$PATH - install: - - choco install visualstudio2019buildtools --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64" - - choco install visualstudio2019-workload-nativedesktop - - - name: "Android armeabi-v7a" - language: android - android: &androidComponents - components: - - tools - - platform-tools - - build-tools-26.0.1 - env: - - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" - - install: &androidInstall - - echo y | sdkmanager "cmake;3.10.2.4988404" - - sudo ln -sf /usr/local/android-sdk/cmake/3.10.2.4988404/bin/cmake /usr/bin/cmake - - wget https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip - - unzip -qq android-ndk-r18b-linux-x86_64.zip - - - name: "Android x86" - language: android - android: *androidComponents - env: - - CMAKE_FLAGS="-DCMAKE_SYSTEM_NAME=Android -DSFML_BUILD_TEST_SUITE=FALSE -DCMAKE_ANDROID_NDK=$TRAVIS_BUILD_DIR/android-ndk-r18b -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang -DCMAKE_ANDROID_STL_TYPE=c++_shared -DCMAKE_ANDROID_API=26" - install: *androidInstall - -notifications: - email: false diff --git a/extern/sfml/CMakeLists.txt b/extern/sfml/CMakeLists.txt index 45e7101..7371175 100644 --- a/extern/sfml/CMakeLists.txt +++ b/extern/sfml/CMakeLists.txt @@ -1,9 +1,4 @@ -# CMake's built-in Android support requires 3.7.0 -if(CMAKE_SYSTEM_NAME MATCHES "Android") - cmake_minimum_required(VERSION 3.7.2) -else() - cmake_minimum_required(VERSION 3.0.2) -endif() +cmake_minimum_required(VERSION 3.7.2) # define a macro that helps defining an option macro(sfml_set_option var default type docstring) @@ -77,7 +72,10 @@ endif() # add options to select which modules to build sfml_set_option(SFML_BUILD_WINDOW TRUE BOOL "TRUE to build SFML's Window module. This setting is ignored, if the graphics module is built.") -sfml_set_option(SFML_BUILD_GRAPHICS TRUE BOOL "TRUE to build SFML's gRAPHICS module.") +sfml_set_option(SFML_BUILD_GRAPHICS TRUE BOOL "TRUE to build SFML's Graphics module.") +sfml_set_option(SFML_BUILD_AUDIO TRUE BOOL "TRUE to build SFML's Audio module.") +sfml_set_option(SFML_BUILD_NETWORK TRUE BOOL "TRUE to build SFML's Network module.") + # add an option for building the API documentation sfml_set_option(SFML_BUILD_DOC FALSE BOOL "TRUE to generate the API documentation, FALSE to ignore it") @@ -146,7 +144,7 @@ endif() # For miscellaneous files if(SFML_OS_WINDOWS OR SFML_OS_IOS) set(DEFAULT_INSTALL_MISC_DIR .) -elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) +elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD) set(DEFAULT_INSTALL_MISC_DIR share/SFML) elseif(SFML_OS_MACOSX) set(DEFAULT_INSTALL_MISC_DIR /usr/local/share/SFML) @@ -255,10 +253,12 @@ if(SFML_OS_MACOSX) endif() endif() - # only the default architecture (i.e. 64-bit) is supported - if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64") - message(FATAL_ERROR "Only 64-bit architecture is supported") - endif() + # only the default x86_64 or arm64 are supported + foreach (arch IN LISTS CMAKE_OSX_ARCHITECTURES) + if (NOT (arch STREQUAL "x86_64" OR arch STREQUAL "arm64")) + message(FATAL_ERROR "Invalid arch ${arch}") + endif() + endforeach() # configure Xcode templates set(XCODE_TEMPLATES_ARCH "\$(NATIVE_ARCH_ACTUAL)") @@ -288,7 +288,7 @@ endif() # on Linux and BSD-like OS, install pkg-config files by default set(SFML_INSTALL_PKGCONFIG_DEFAULT FALSE) -if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) +if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD) set(SFML_INSTALL_PKGCONFIG_DEFAULT TRUE) endif() diff --git a/extern/sfml/cmake/Config.cmake b/extern/sfml/cmake/Config.cmake index ec38208..116eddd 100644 --- a/extern/sfml/cmake/Config.cmake +++ b/extern/sfml/cmake/Config.cmake @@ -35,6 +35,10 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "^OpenBSD$") set(SFML_OS_OPENBSD 1) # don't use the OpenGL ES implementation on OpenBSD set(OPENGL_ES 0) +elseif(CMAKE_SYSTEM_NAME MATCHES "^NetBSD$") + set(SFML_OS_NETBSD 1) + # don't use the OpenGL ES implementation on NetBSD + set(OPENGL_ES 0) elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") if(IOS) set(SFML_OS_IOS 1) @@ -73,7 +77,7 @@ endif() # this could be e.g. macports on mac or msys2 on windows etc. set(SFML_PKGCONFIG_DIR "/${CMAKE_INSTALL_LIBDIR}/pkgconfig") -if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD) +if(SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD) set(SFML_PKGCONFIG_DIR "/libdata/pkgconfig") endif() diff --git a/extern/sfml/extlibs/headers/glad/include/glad/gl.h b/extern/sfml/extlibs/headers/glad/include/glad/gl.h index eca4707..6d56850 100644 --- a/extern/sfml/extlibs/headers/glad/include/glad/gl.h +++ b/extern/sfml/extlibs/headers/glad/include/glad/gl.h @@ -1,12 +1,12 @@ /** - * Loader generated by glad 2.0.0-beta on Wed Jul 17 20:53:00 2019 + * Loader generated by glad 2.0.0-beta on Sat Mar 27 13:31:41 2021 * * Generator: C/C++ * Specification: gl - * Extensions: 44 + * Extensions: 94 * * APIs: - * - gl:compatibility=1.1 + * - gl:compatibility=4.6 * - gles1:common=1.0 * * Options: @@ -19,21 +19,39 @@ * - MX = False * * Commandline: - * --merge --api='gl:compatibility=1.1,gles1:common=1.0' --extensions='GL_ARB_copy_buffer,GL_ARB_fragment_shader,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_imaging,GL_ARB_multitexture,GL_ARB_separate_shader_objects,GL_ARB_shader_objects,GL_ARB_shading_language_100,GL_ARB_texture_non_power_of_two,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_copy_texture,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_packed_depth_stencil,GL_EXT_subtexture,GL_EXT_texture_array,GL_EXT_texture_object,GL_EXT_texture_sRGB,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_NV_geometry_program4,GL_NV_vertex_program,GL_SGIS_texture_edge_clamp,GL_EXT_sRGB,GL_OES_blend_equation_separate,GL_OES_blend_func_separate,GL_OES_blend_subtract,GL_OES_depth24,GL_OES_depth32,GL_OES_framebuffer_object,GL_OES_packed_depth_stencil,GL_OES_single_precision,GL_OES_texture_npot' c --alias --header-only + * --merge --api='gl:compatibility=4.6,gles1:common=1.0' --extensions='GL_ARB_ES2_compatibility,GL_ARB_ES3_1_compatibility,GL_ARB_base_instance,GL_ARB_blend_func_extended,GL_ARB_buffer_storage,GL_ARB_clear_buffer_object,GL_ARB_clear_texture,GL_ARB_clip_control,GL_ARB_compute_shader,GL_ARB_copy_buffer,GL_ARB_copy_image,GL_ARB_direct_state_access,GL_ARB_draw_elements_base_vertex,GL_ARB_draw_indirect,GL_ARB_fragment_program,GL_ARB_fragment_shader,GL_ARB_framebuffer_no_attachments,GL_ARB_framebuffer_object,GL_ARB_geometry_shader4,GL_ARB_get_program_binary,GL_ARB_get_texture_sub_image,GL_ARB_gpu_shader_fp64,GL_ARB_imaging,GL_ARB_internalformat_query,GL_ARB_internalformat_query2,GL_ARB_invalidate_subdata,GL_ARB_map_buffer_range,GL_ARB_multi_bind,GL_ARB_multi_draw_indirect,GL_ARB_multitexture,GL_ARB_polygon_offset_clamp,GL_ARB_program_interface_query,GL_ARB_provoking_vertex,GL_ARB_sampler_objects,GL_ARB_separate_shader_objects,GL_ARB_shader_atomic_counters,GL_ARB_shader_image_load_store,GL_ARB_shader_objects,GL_ARB_shader_storage_buffer_object,GL_ARB_shader_subroutine,GL_ARB_shading_language_100,GL_ARB_sync,GL_ARB_tessellation_shader,GL_ARB_texture_barrier,GL_ARB_texture_buffer_range,GL_ARB_texture_multisample,GL_ARB_texture_non_power_of_two,GL_ARB_texture_storage,GL_ARB_texture_storage_multisample,GL_ARB_texture_view,GL_ARB_timer_query,GL_ARB_transform_feedback2,GL_ARB_transform_feedback3,GL_ARB_transform_feedback_instanced,GL_ARB_uniform_buffer_object,GL_ARB_vertex_array_object,GL_ARB_vertex_attrib_64bit,GL_ARB_vertex_attrib_binding,GL_ARB_vertex_buffer_object,GL_ARB_vertex_program,GL_ARB_vertex_shader,GL_ARB_vertex_type_2_10_10_10_rev,GL_ARB_viewport_array,GL_EXT_blend_equation_separate,GL_EXT_blend_func_separate,GL_EXT_blend_minmax,GL_EXT_blend_subtract,GL_EXT_copy_texture,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_EXT_geometry_shader4,GL_EXT_packed_depth_stencil,GL_EXT_subtexture,GL_EXT_texture_array,GL_EXT_texture_object,GL_EXT_texture_sRGB,GL_EXT_vertex_array,GL_INGR_blend_func_separate,GL_KHR_debug,GL_KHR_robustness,GL_NV_geometry_program4,GL_NV_vertex_program,GL_OES_single_precision,GL_SGIS_texture_edge_clamp,GL_EXT_sRGB,GL_OES_blend_equation_separate,GL_OES_blend_func_separate,GL_OES_blend_subtract,GL_OES_depth24,GL_OES_depth32,GL_OES_framebuffer_object,GL_OES_packed_depth_stencil,GL_OES_texture_npot' c --alias --header-only * * Online: - * http://glad.sh/#api=gl%3Acompatibility%3D1.1%2Cgles1%3Acommon%3D1.0&extensions=GL_ARB_copy_buffer%2CGL_ARB_fragment_shader%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_get_program_binary%2CGL_ARB_imaging%2CGL_ARB_multitexture%2CGL_ARB_separate_shader_objects%2CGL_ARB_shader_objects%2CGL_ARB_shading_language_100%2CGL_ARB_texture_non_power_of_two%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_blend_subtract%2CGL_EXT_copy_texture%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_geometry_shader4%2CGL_EXT_packed_depth_stencil%2CGL_EXT_subtexture%2CGL_EXT_texture_array%2CGL_EXT_texture_object%2CGL_EXT_texture_sRGB%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_NV_geometry_program4%2CGL_NV_vertex_program%2CGL_SGIS_texture_edge_clamp%2CGL_EXT_sRGB%2CGL_OES_blend_equation_separate%2CGL_OES_blend_func_separate%2CGL_OES_blend_subtract%2CGL_OES_depth24%2CGL_OES_depth32%2CGL_OES_framebuffer_object%2CGL_OES_packed_depth_stencil%2CGL_OES_single_precision%2CGL_OES_texture_npot&generator=c&options=MERGE%2CALIAS%2CHEADER_ONLY + * http://gen.glad.sh/#profile=gl%3Dcompatibility%2Cgles1%3Dcommon&api=gl%3D4.6%2Cgles1%3D1.0&extensions=GL_ARB_copy_buffer%2CGL_ARB_fragment_shader%2CGL_ARB_framebuffer_object%2CGL_ARB_geometry_shader4%2CGL_ARB_get_program_binary%2CGL_ARB_imaging%2CGL_ARB_multitexture%2CGL_ARB_separate_shader_objects%2CGL_ARB_shader_objects%2CGL_ARB_shading_language_100%2CGL_ARB_texture_non_power_of_two%2CGL_ARB_vertex_buffer_object%2CGL_ARB_vertex_program%2CGL_ARB_vertex_shader%2CGL_EXT_blend_equation_separate%2CGL_EXT_blend_func_separate%2CGL_EXT_blend_minmax%2CGL_EXT_blend_subtract%2CGL_EXT_copy_texture%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_EXT_geometry_shader4%2CGL_EXT_packed_depth_stencil%2CGL_EXT_sRGB%2CGL_EXT_subtexture%2CGL_EXT_texture_array%2CGL_EXT_texture_object%2CGL_EXT_texture_sRGB%2CGL_EXT_vertex_array%2CGL_INGR_blend_func_separate%2CGL_KHR_debug%2CGL_NV_geometry_program4%2CGL_NV_vertex_program%2CGL_OES_blend_equation_separate%2CGL_OES_blend_func_separate%2CGL_OES_blend_subtract%2CGL_OES_depth24%2CGL_OES_depth32%2CGL_OES_framebuffer_object%2CGL_OES_packed_depth_stencil%2CGL_OES_single_precision%2CGL_OES_texture_npot%2CGL_SGIS_texture_edge_clamp&options=ALIAS%2CALIAS%2CHEADER_ONLY%2CMERGE%2CMERGE&generator=c * */ #ifndef SF_GLAD_GL_H_ #define SF_GLAD_GL_H_ +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wreserved-id-macro" +#endif #ifdef __gl_h_ - #error OpenGL header already included (API: gl), remove previous include! + #error OpenGL (gl.h) header already included (API: gl), remove previous include! #endif #define __gl_h_ 1 - +#ifdef __gl3_h_ + #error OpenGL (gl3.h) header already included (API: gl), remove previous include! +#endif +#define __gl3_h_ 1 +#ifdef __glext_h_ + #error OpenGL (glext.h) header already included (API: gl), remove previous include! +#endif +#define __glext_h_ 1 +#ifdef __gl3ext_h_ + #error OpenGL (gl3ext.h) header already included (API: gl), remove previous include! +#endif +#define __gl3ext_h_ 1 +#ifdef __clang__ +#pragma clang diagnostic pop +#endif #define SF_GLAD_GL #define GLAD_OPTION_GL_ALIAS @@ -172,10 +190,29 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_ACCUM_CLEAR_VALUE 0x0B80 #define GL_ACCUM_GREEN_BITS 0x0D59 #define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A #define GL_ACTIVE_PROGRAM 0x8259 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_ACTIVE_TEXTURE 0x84E0 #define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_VARIABLES 0x9305 #define GL_ADD 0x0104 +#define GL_ADD_SIGNED 0x8574 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D #define GL_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF #define GL_ALL_SHADER_BITS 0xFFFFFFFF #define GL_ALPHA 0x1906 #define GL_ALPHA12 0x803D @@ -184,23 +221,48 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_ALPHA8 0x803C #define GL_ALPHA_BIAS 0x0D1D #define GL_ALPHA_BITS 0x0D55 +#define GL_ALPHA_INTEGER 0x8D97 #define GL_ALPHA_SCALE 0x0D1C #define GL_ALPHA_TEST 0x0BC0 #define GL_ALPHA_TEST_FUNC 0x0BC1 #define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALREADY_SIGNALED 0x911A #define GL_ALWAYS 0x0207 #define GL_AMBIENT 0x1200 #define GL_AMBIENT_AND_DIFFUSE 0x1602 #define GL_AND 0x1501 #define GL_AND_INVERTED 0x1504 #define GL_AND_REVERSE 0x1502 +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_ARRAY_BUFFER 0x8892 #define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ARRAY_SIZE 0x92FB +#define GL_ARRAY_STRIDE 0x92FE +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATTACHED_SHADERS 0x8B85 #define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 #define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 #define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 #define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 #define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_AUTO_NORMAL 0x0D80 #define GL_AUX0 0x0409 #define GL_AUX1 0x040A @@ -210,48 +272,101 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_BACK 0x0405 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_BGRA_INTEGER 0x8D9B +#define GL_BGR_INTEGER 0x8D9A #define GL_BITMAP 0x1A00 #define GL_BITMAP_TOKEN 0x0704 #define GL_BLEND 0x0BE2 #define GL_BLEND_COLOR 0x8005 #define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_DST_ALPHA 0x80CA #define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_DST_RGB 0x80C8 #define GL_BLEND_DST_RGB_EXT 0x80C8 #define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D #define GL_BLEND_EQUATION_ALPHA_EXT 0x883D #define GL_BLEND_EQUATION_EXT 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 #define GL_BLEND_EQUATION_RGB_EXT 0x8009 #define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_SRC_ALPHA 0x80CB #define GL_BLEND_SRC_ALPHA_EXT 0x80CB +#define GL_BLEND_SRC_RGB 0x80C9 #define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLOCK_INDEX 0x92FD #define GL_BLUE 0x1905 #define GL_BLUE_BIAS 0x0D1B #define GL_BLUE_BITS 0x0D54 +#define GL_BLUE_INTEGER 0x8D96 #define GL_BLUE_SCALE 0x0D1A +#define GL_BOOL 0x8B56 #define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4 0x8B59 #define GL_BOOL_VEC4_ARB 0x8B59 #define GL_BUFFER 0x82E0 +#define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_BUFFER_MAP_POINTER 0x88BD #define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_BUFFER_SIZE 0x8764 #define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_BUFFER_USAGE 0x8765 #define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_BUFFER_VARIABLE 0x92E5 #define GL_BYTE 0x1400 #define GL_C3F_V3F 0x2A24 #define GL_C4F_N3F_V3F 0x2A26 #define GL_C4UB_V2F 0x2A22 #define GL_C4UB_V3F 0x2A23 +#define GL_CAVEAT_SUPPORT 0x82B8 #define GL_CCW 0x0901 #define GL_CLAMP 0x2900 +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLAMP_TO_EDGE 0x812F #define GL_CLAMP_TO_EDGE_SGIS 0x812F +#define GL_CLAMP_VERTEX_COLOR 0x891A #define GL_CLEAR 0x1500 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 #define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 #define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF #define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 #define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_STORAGE_BIT 0x0200 #define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_CLIP_ORIGIN 0x935C #define GL_CLIP_PLANE0 0x3000 #define GL_CLIP_PLANE1 0x3001 #define GL_CLIP_PLANE2 0x3002 @@ -261,6 +376,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_COEFF 0x0A00 #define GL_COLOR 0x1800 #define GL_COLOR_ARRAY 0x8076 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 #define GL_COLOR_ARRAY_COUNT_EXT 0x8084 #define GL_COLOR_ARRAY_EXT 0x8076 @@ -287,10 +403,26 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_COLOR_ATTACHMENT14_EXT 0x8CEE #define GL_COLOR_ATTACHMENT15 0x8CEF #define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 #define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 #define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD #define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 #define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF #define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 #define GL_COLOR_ATTACHMENT4 0x8CE4 #define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 @@ -306,6 +438,8 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_COLOR_ENCODING 0x8296 #define GL_COLOR_INDEX 0x1900 #define GL_COLOR_INDEXES 0x1603 #define GL_COLOR_LOGIC_OP 0x0BF2 @@ -314,6 +448,8 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_COLOR_MATERIAL_PARAMETER 0x0B56 #define GL_COLOR_MATRIX 0x80B1 #define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_COLOR_SUM 0x8458 #define GL_COLOR_SUM_ARB 0x8458 #define GL_COLOR_TABLE 0x80D0 #define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD @@ -327,22 +463,81 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_COLOR_TABLE_SCALE 0x80D6 #define GL_COLOR_TABLE_WIDTH 0x80D9 #define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMBINE 0x8570 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B #define GL_COMPILE 0x1300 #define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_RG 0x8226 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B #define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B #define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E #define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F #define GL_COMPRESSED_SRGB_EXT 0x8C48 #define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_CONDITION_SATISFIED 0x911C +#define GL_CONSTANT 0x8576 #define GL_CONSTANT_ALPHA 0x8003 #define GL_CONSTANT_ATTENUATION 0x1207 #define GL_CONSTANT_BORDER 0x8151 #define GL_CONSTANT_COLOR 0x8001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_FLAGS 0x821E #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_CONTEXT_LOST 0x0507 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 #define GL_CONVOLUTION_1D 0x8010 #define GL_CONVOLUTION_2D 0x8011 #define GL_CONVOLUTION_BORDER_COLOR 0x8154 @@ -352,29 +547,39 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_CONVOLUTION_FORMAT 0x8017 #define GL_CONVOLUTION_HEIGHT 0x8019 #define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_COORD_REPLACE 0x8862 #define GL_COPY 0x1503 #define GL_COPY_INVERTED 0x150C #define GL_COPY_PIXEL_TOKEN 0x0706 #define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_CURRENT_ATTRIB_NV 0x8626 #define GL_CURRENT_BIT 0x00000001 #define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_CURRENT_FOG_COORDINATE 0x8453 #define GL_CURRENT_INDEX 0x0B01 #define GL_CURRENT_MATRIX_ARB 0x8641 #define GL_CURRENT_MATRIX_NV 0x8641 #define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 #define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 #define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_CURRENT_QUERY 0x8865 #define GL_CURRENT_RASTER_COLOR 0x0B04 #define GL_CURRENT_RASTER_DISTANCE 0x0B09 #define GL_CURRENT_RASTER_INDEX 0x0B05 #define GL_CURRENT_RASTER_POSITION 0x0B07 #define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F #define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 #define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 #define GL_CW 0x0900 #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 @@ -405,44 +610,95 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DECAL 0x2101 #define GL_DECR 0x1E03 +#define GL_DECR_WRAP 0x8508 +#define GL_DELETE_STATUS 0x8B80 #define GL_DEPTH 0x1801 #define GL_DEPTH24_STENCIL8 0x88F0 #define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_DEPTH32F_STENCIL8 0x8CAD #define GL_DEPTH_ATTACHMENT 0x8D00 #define GL_DEPTH_ATTACHMENT_EXT 0x8D00 #define GL_DEPTH_BIAS 0x0D1F #define GL_DEPTH_BITS 0x0D56 #define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_DEPTH_CLAMP 0x864F #define GL_DEPTH_CLEAR_VALUE 0x0B73 #define GL_DEPTH_COMPONENT 0x1902 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH_COMPONENTS 0x8284 #define GL_DEPTH_FUNC 0x0B74 #define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_RENDERABLE 0x8287 #define GL_DEPTH_SCALE 0x0D1E #define GL_DEPTH_STENCIL 0x84F9 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A #define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_TEXTURE_MODE 0x884B #define GL_DEPTH_WRITEMASK 0x0B72 #define GL_DIFFUSE 0x1201 +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_DISPLAY_LIST 0x82E7 #define GL_DITHER 0x0BD0 #define GL_DOMAIN 0x0A02 #define GL_DONT_CARE 0x1100 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF #define GL_DOUBLE 0x140A #define GL_DOUBLEBUFFER 0x0C32 +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE #define GL_DRAW_BUFFER 0x0C01 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 #define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 #define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 #define GL_DRAW_PIXEL_TOKEN 0x0705 #define GL_DST_ALPHA 0x0304 #define GL_DST_COLOR 0x0306 +#define GL_DYNAMIC_COPY 0x88EA #define GL_DYNAMIC_COPY_ARB 0x88EA +#define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 #define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 #define GL_EDGE_FLAG 0x0B43 #define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B #define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B #define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D #define GL_EDGE_FLAG_ARRAY_EXT 0x8079 @@ -450,7 +706,10 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 #define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 #define GL_EMISSION 0x1600 #define GL_ENABLE_BIT 0x00002000 @@ -469,27 +728,69 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 #define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 #define GL_FILL 0x1B02 +#define GL_FILTER 0x829A +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_FIXED 0x140C +#define GL_FIXED_ONLY 0x891D #define GL_FLAT 0x1D00 #define GL_FLOAT 0x1406 +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_FLOAT_MAT2 0x8B5A #define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3 0x8B5B #define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4 0x8B5C #define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 #define GL_FLOAT_VEC4_ARB 0x8B52 #define GL_FOG 0x0B60 #define GL_FOG_BIT 0x00000080 #define GL_FOG_COLOR 0x0B66 +#define GL_FOG_COORD 0x8451 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D #define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_SRC 0x8450 #define GL_FOG_DENSITY 0x0B62 #define GL_FOG_END 0x0B64 #define GL_FOG_HINT 0x0C54 #define GL_FOG_INDEX 0x0B61 #define GL_FOG_MODE 0x0B65 #define GL_FOG_START 0x0B63 +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_FRAGMENT_SHADER 0x8B30 #define GL_FRAGMENT_SHADER_ARB 0x8B30 #define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_FRAGMENT_TEXTURE 0x829F #define GL_FRAMEBUFFER 0x8D40 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 @@ -497,6 +798,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 #define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 #define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 #define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 @@ -512,11 +814,18 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_FRAMEBUFFER_BINDING 0x8CA6 #define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_FRAMEBUFFER_BLEND 0x828B #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 #define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_EXT 0x8D40 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 @@ -526,6 +835,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 @@ -534,6 +844,9 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD #define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD @@ -542,28 +855,47 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRONT_FACE 0x0B46 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 +#define GL_FULL_SUPPORT 0x82B7 #define GL_FUNC_ADD 0x8006 #define GL_FUNC_ADD_EXT 0x8006 #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B #define GL_FUNC_SUBTRACT 0x800A #define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB #define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC #define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC #define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_GEOMETRY_SHADER 0x8DD9 #define GL_GEOMETRY_SHADER_ARB 0x8DD9 #define GL_GEOMETRY_SHADER_BIT 0x00000004 #define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA #define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA #define GL_GEQUAL 0x0206 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_GREATER 0x0204 #define GL_GREEN 0x1904 #define GL_GREEN_BIAS 0x0D19 #define GL_GREEN_BITS 0x0D53 +#define GL_GREEN_INTEGER 0x8D95 #define GL_GREEN_SCALE 0x0D18 +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_HALF_FLOAT 0x140B +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_HIGH_INT 0x8DF5 #define GL_HINT_BIT 0x00008000 #define GL_HISTOGRAM 0x8024 #define GL_HISTOGRAM_ALPHA_SIZE 0x802B @@ -575,9 +907,48 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_HISTOGRAM_SINK 0x802D #define GL_HISTOGRAM_WIDTH 0x8026 #define GL_IDENTITY_NV 0x862A +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_INCR 0x1E02 +#define GL_INCR_WRAP 0x8507 #define GL_INDEX 0x8222 #define GL_INDEX_ARRAY 0x8077 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 #define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 #define GL_INDEX_ARRAY_COUNT_EXT 0x8087 #define GL_INDEX_ARRAY_EXT 0x8077 @@ -594,24 +965,75 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_INDEX_OFFSET 0x0D13 #define GL_INDEX_SHIFT 0x0D12 #define GL_INDEX_WRITEMASK 0x0C21 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 #define GL_INT 0x1404 #define GL_INTENSITY 0x8049 #define GL_INTENSITY12 0x804C #define GL_INTENSITY16 0x804D #define GL_INTENSITY4 0x804A #define GL_INTENSITY8 0x804B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERPOLATE 0x8575 +#define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_INT_VEC2 0x8B53 #define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3 0x8B54 #define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4 0x8B55 #define GL_INT_VEC4_ARB 0x8B55 #define GL_INVALID_ENUM 0x0500 #define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_INVALID_INDEX 0xFFFFFFFF #define GL_INVALID_OPERATION 0x0502 #define GL_INVALID_VALUE 0x0501 #define GL_INVERSE_NV 0x862B #define GL_INVERSE_TRANSPOSE_NV 0x862D #define GL_INVERT 0x150A +#define GL_ISOLINES 0x8E7A +#define GL_IS_PER_PATCH 0x92E7 +#define GL_IS_ROW_MAJOR 0x9300 #define GL_KEEP 0x1E00 +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_LEFT 0x0406 #define GL_LEQUAL 0x0203 #define GL_LESS 0x0201 @@ -626,6 +1048,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_LIGHTING 0x0B50 #define GL_LIGHTING_BIT 0x00000040 #define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 #define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 #define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 #define GL_LINE 0x1B01 @@ -634,6 +1057,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_LINEAR_MIPMAP_NEAREST 0x2701 #define GL_LINES 0x0001 +#define GL_LINES_ADJACENCY 0x000A #define GL_LINES_ADJACENCY_ARB 0x000A #define GL_LINES_ADJACENCY_EXT 0x000A #define GL_LINE_BIT 0x00000004 @@ -645,19 +1069,28 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_LINE_STIPPLE_PATTERN 0x0B25 #define GL_LINE_STIPPLE_REPEAT 0x0B26 #define GL_LINE_STRIP 0x0003 +#define GL_LINE_STRIP_ADJACENCY 0x000B #define GL_LINE_STRIP_ADJACENCY_ARB 0x000B #define GL_LINE_STRIP_ADJACENCY_EXT 0x000B #define GL_LINE_TOKEN 0x0702 #define GL_LINE_WIDTH 0x0B21 #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINK_STATUS 0x8B82 #define GL_LIST_BASE 0x0B32 #define GL_LIST_BIT 0x00020000 #define GL_LIST_INDEX 0x0B33 #define GL_LIST_MODE 0x0B30 #define GL_LOAD 0x0101 +#define GL_LOCATION 0x930E +#define GL_LOCATION_COMPONENT 0x934A +#define GL_LOCATION_INDEX 0x930F #define GL_LOGIC_OP 0x0BF1 #define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_LOW_INT 0x8DF3 #define GL_LUMINANCE 0x1909 #define GL_LUMINANCE12 0x8041 #define GL_LUMINANCE12_ALPHA12 0x8047 @@ -670,6 +1103,8 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_LUMINANCE8 0x8040 #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_LUMINANCE_ALPHA 0x190A +#define GL_MAJOR_VERSION 0x821B +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_MAP1_COLOR_4 0x0D90 #define GL_MAP1_GRID_DOMAIN 0x0DD0 #define GL_MAP1_GRID_SEGMENTS 0x0DD1 @@ -724,8 +1159,16 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 #define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 #define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP_COHERENT_BIT 0x0080 #define GL_MAP_COLOR 0x0D10 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_READ_BIT 0x0001 #define GL_MAP_STENCIL 0x0D11 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_MAP_WRITE_BIT 0x0002 #define GL_MATRIX0_ARB 0x88C0 #define GL_MATRIX0_NV 0x8630 #define GL_MATRIX10_ARB 0x88CA @@ -767,40 +1210,118 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_MATRIX8_ARB 0x88C8 #define GL_MATRIX9_ARB 0x88C9 #define GL_MATRIX_MODE 0x0BA0 +#define GL_MATRIX_STRIDE 0x92FF #define GL_MAX 0x8008 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF #define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 #define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_MAX_CLIP_DISTANCES 0x0D32 #define GL_MAX_CLIP_PLANES 0x0D32 #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF #define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF #define GL_MAX_CONVOLUTION_HEIGHT 0x801B #define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_CULL_DISTANCES 0x82F9 #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENT_INDEX 0x8D6B #define GL_MAX_EVAL_ORDER 0x0D30 #define GL_MAX_EXT 0x8008 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 #define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD #define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_INTEGER_SAMPLES 0x9110 #define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_LAYERS 0x8281 #define GL_MAX_LIGHTS 0x0D31 #define GL_MAX_LIST_NESTING 0x0B31 #define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_LENGTH 0x92F6 #define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_PIXEL_MAP_TABLE 0x0D34 #define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B #define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD #define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 #define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 @@ -808,52 +1329,133 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_MAX_PROGRAM_MATRICES_ARB 0x862F #define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E #define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E #define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF #define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 #define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB #define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F #define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 #define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 #define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C #define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 #define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 #define GL_MAX_SAMPLES 0x8D57 #define GL_MAX_SAMPLES_EXT 0x8D57 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_MAX_TEXTURE_COORDS 0x8871 #define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF #define GL_MAX_TEXTURE_SIZE 0x0D33 #define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_TEXTURE_UNITS 0x84E2 #define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 #define GL_MAX_TRACK_MATRICES_NV 0x862F #define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GL_MAX_VARYING_COMPONENTS 0x8B4B #define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_VARYING_FLOATS 0x8B4B #define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_VERTEX_ATTRIBS 0x8869 #define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A #define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB #define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE #define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VIEWPORTS 0x825B #define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_WIDTH 0x827E +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_MEDIUM_INT 0x8DF4 #define GL_MIN 0x8007 #define GL_MINMAX 0x802E #define GL_MINMAX_FORMAT 0x802F #define GL_MINMAX_SINK 0x8030 +#define GL_MINOR_VERSION 0x821C #define GL_MIN_EXT 0x8007 +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIPMAP 0x8293 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 #define GL_MODELVIEW 0x1700 #define GL_MODELVIEW_MATRIX 0x0BA6 #define GL_MODELVIEW_PROJECTION_NV 0x8629 #define GL_MODELVIEW_STACK_DEPTH 0x0BA3 #define GL_MODULATE 0x2100 #define GL_MULT 0x0103 +#define GL_MULTISAMPLE 0x809D +#define GL_MULTISAMPLE_BIT 0x20000000 #define GL_N3F_V3F 0x2A25 +#define GL_NAME_LENGTH 0x92F9 #define GL_NAME_STACK_DEPTH 0x0D70 #define GL_NAND 0x150E #define GL_NEAREST 0x2600 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 #define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E #define GL_NEVER 0x0200 #define GL_NICEST 0x1102 #define GL_NONE 0 @@ -861,6 +1463,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_NOR 0x1508 #define GL_NORMALIZE 0x0BA1 #define GL_NORMAL_ARRAY 0x8075 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 #define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 #define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 #define GL_NORMAL_ARRAY_EXT 0x8075 @@ -870,9 +1473,19 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F #define GL_NORMAL_ARRAY_TYPE 0x807E #define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_MAP 0x8511 #define GL_NOTEQUAL 0x0205 #define GL_NO_ERROR 0 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_NUM_EXTENSIONS 0x821D #define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 #define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 #define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A #define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 @@ -886,28 +1499,51 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_OBJECT_PLANE 0x2501 #define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 #define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_OBJECT_TYPE 0x9112 #define GL_OBJECT_TYPE_ARB 0x8B4E #define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OFFSET 0x92FC #define GL_ONE 1 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 #define GL_ONE_MINUS_DST_ALPHA 0x0305 #define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_OPERAND2_RGB 0x8592 #define GL_OR 0x1507 #define GL_ORDER 0x0A01 #define GL_OR_INVERTED 0x150D #define GL_OR_REVERSE 0x150B #define GL_OUT_OF_MEMORY 0x0505 #define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_IMAGES 0x806B #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF #define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_PATCHES 0x000E +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_PATCH_VERTICES 0x8E72 #define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_PIXEL_MAP_A_TO_A 0x0C79 #define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 #define GL_PIXEL_MAP_B_TO_B 0x0C78 @@ -929,18 +1565,29 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_PIXEL_MAP_S_TO_S 0x0C71 #define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 #define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF #define GL_POINT 0x1B00 #define GL_POINTS 0x0000 #define GL_POINT_BIT 0x00000002 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 #define GL_POINT_SIZE 0x0B11 #define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_SIZE_MIN 0x8126 #define GL_POINT_SIZE_RANGE 0x0B12 #define GL_POINT_SMOOTH 0x0B10 #define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_POINT_SPRITE 0x8861 +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 #define GL_POINT_TOKEN 0x0701 #define GL_POLYGON 0x0009 #define GL_POLYGON_BIT 0x00000008 #define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B #define GL_POLYGON_OFFSET_FACTOR 0x8038 #define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_POLYGON_OFFSET_LINE 0x2A02 @@ -970,8 +1617,17 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D #define GL_POST_CONVOLUTION_RED_BIAS 0x8020 #define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_PREVIOUS 0x8578 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E #define GL_PROGRAM 0x82E2 #define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 #define GL_PROGRAM_ATTRIBS_ARB 0x88AC #define GL_PROGRAM_BINARY_FORMATS 0x87FF #define GL_PROGRAM_BINARY_LENGTH 0x8741 @@ -982,19 +1638,25 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_PROGRAM_ERROR_STRING_ARB 0x8874 #define GL_PROGRAM_FORMAT_ARB 0x8876 #define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_INPUT 0x92E3 #define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 #define GL_PROGRAM_LENGTH_ARB 0x8627 #define GL_PROGRAM_LENGTH_NV 0x8627 #define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 #define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE #define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 #define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA #define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 #define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_PROGRAM_OUTPUT 0x92E4 #define GL_PROGRAM_PARAMETERS_ARB 0x88A8 #define GL_PROGRAM_PARAMETER_NV 0x8644 #define GL_PROGRAM_PIPELINE 0x82E4 #define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_PROGRAM_POINT_SIZE 0x8642 #define GL_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_PROGRAM_POINT_SIZE_EXT 0x8642 #define GL_PROGRAM_RESIDENT_NV 0x8647 @@ -1003,37 +1665,92 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_PROGRAM_STRING_NV 0x8628 #define GL_PROGRAM_TARGET_NV 0x8646 #define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 #define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 #define GL_PROJECTION 0x1701 #define GL_PROJECTION_MATRIX 0x0BA7 #define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_PROVOKING_VERTEX 0x8E4F #define GL_PROXY_COLOR_TABLE 0x80D3 #define GL_PROXY_HISTOGRAM 0x8025 #define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 #define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 #define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 #define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 #define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B #define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 #define GL_Q 0x2003 #define GL_QUADRATIC_ATTENUATION 0x1209 #define GL_QUADS 0x0007 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C #define GL_QUAD_STRIP 0x0008 #define GL_QUERY 0x82E3 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_QUERY_TARGET 0x82EA +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_WAIT_INVERTED 0x8E17 #define GL_R 0x2002 +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_R16 0x822A +#define GL_R16F 0x822D +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R16_SNORM 0x8F98 +#define GL_R32F 0x822E +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 #define GL_R3_G3_B2 0x2A10 +#define GL_R8 0x8229 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R8_SNORM 0x8F94 +#define GL_RASTERIZER_DISCARD 0x8C89 #define GL_READ_BUFFER 0x0C02 #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA #define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_READ_ONLY 0x88B8 #define GL_READ_ONLY_ARB 0x88B8 +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_READ_WRITE 0x88BA #define GL_READ_WRITE_ARB 0x88BA #define GL_RED 0x1903 #define GL_REDUCE 0x8016 #define GL_RED_BIAS 0x0D15 #define GL_RED_BITS 0x0D52 +#define GL_RED_INTEGER 0x8D94 #define GL_RED_SCALE 0x0D14 +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFLECTION_MAP 0x8512 #define GL_RENDER 0x1C00 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 @@ -1064,77 +1781,223 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_REPEAT 0x2901 #define GL_REPLACE 0x1E01 #define GL_REPLICATE_BORDER 0x8153 +#define GL_RESCALE_NORMAL 0x803A +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 #define GL_RETURN 0x0102 +#define GL_RG 0x8227 +#define GL_RG16 0x822C +#define GL_RG16F 0x822F +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG16_SNORM 0x8F99 +#define GL_RG32F 0x8230 +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_RG8 0x822B +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG8_SNORM 0x8F95 #define GL_RGB 0x1907 #define GL_RGB10 0x8052 #define GL_RGB10_A2 0x8059 +#define GL_RGB10_A2UI 0x906F #define GL_RGB12 0x8053 #define GL_RGB16 0x8054 +#define GL_RGB16F 0x881B +#define GL_RGB16I 0x8D89 +#define GL_RGB16UI 0x8D77 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGB32F 0x8815 +#define GL_RGB32I 0x8D83 +#define GL_RGB32UI 0x8D71 #define GL_RGB4 0x804F #define GL_RGB5 0x8050 +#define GL_RGB565 0x8D62 #define GL_RGB5_A1 0x8057 #define GL_RGB8 0x8051 +#define GL_RGB8I 0x8D8F +#define GL_RGB8UI 0x8D7D +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGB9_E5 0x8C3D #define GL_RGBA 0x1908 #define GL_RGBA12 0x805A #define GL_RGBA16 0x805B +#define GL_RGBA16F 0x881A +#define GL_RGBA16I 0x8D88 +#define GL_RGBA16UI 0x8D76 +#define GL_RGBA16_SNORM 0x8F9B #define GL_RGBA2 0x8055 +#define GL_RGBA32F 0x8814 +#define GL_RGBA32I 0x8D82 +#define GL_RGBA32UI 0x8D70 #define GL_RGBA4 0x8056 #define GL_RGBA8 0x8058 +#define GL_RGBA8I 0x8D8E +#define GL_RGBA8UI 0x8D7C +#define GL_RGBA8_SNORM 0x8F97 +#define GL_RGBA_INTEGER 0x8D99 #define GL_RGBA_MODE 0x0C31 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGB_SCALE 0x8573 +#define GL_RG_INTEGER 0x8228 #define GL_RIGHT 0x0407 #define GL_S 0x2000 #define GL_SAMPLER 0x82E6 +#define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_1D_SHADOW 0x8B61 #define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D 0x8B5E #define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_SAMPLER_2D_RECT 0x8B63 #define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 #define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_SAMPLER_2D_SHADOW 0x8B62 #define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_3D 0x8B5F #define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_SAMPLER_CUBE 0x8B60 #define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_SHADING 0x8C36 #define GL_SCISSOR_BIT 0x00080000 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C #define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B #define GL_SELECT 0x1C02 #define GL_SELECTION_BUFFER_POINTER 0x0DF3 #define GL_SELECTION_BUFFER_SIZE 0x0DF4 #define GL_SEPARABLE_2D 0x8012 +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA #define GL_SET 0x150F #define GL_SHADER 0x82E1 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_TYPE 0x8B4F #define GL_SHADE_MODEL 0x0B54 +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C #define GL_SHININESS 0x1601 #define GL_SHORT 0x1402 +#define GL_SIGNALED 0x9119 +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 #define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 #define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_SLUMINANCE_ALPHA 0x8C44 #define GL_SLUMINANCE_ALPHA_EXT 0x8C44 #define GL_SLUMINANCE_EXT 0x8C46 #define GL_SMOOTH 0x1D01 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_SOURCE2_RGB 0x8582 #define GL_SPECULAR 0x1202 #define GL_SPHERE_MAP 0x2402 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_SPIR_V_EXTENSIONS 0x9553 #define GL_SPOT_CUTOFF 0x1206 #define GL_SPOT_DIRECTION 0x1204 #define GL_SPOT_EXPONENT 0x1205 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC1_COLOR 0x88F9 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_ALPHA 0x858A +#define GL_SRC2_RGB 0x8582 #define GL_SRC_ALPHA 0x0302 #define GL_SRC_ALPHA_SATURATE 0x0308 #define GL_SRC_COLOR 0x0300 +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB8_ALPHA8 0x8C43 #define GL_SRGB8_ALPHA8_EXT 0x8C43 #define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 #define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB_DECODE_ARB 0x8299 #define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 #define GL_STACK_OVERFLOW 0x0503 #define GL_STACK_UNDERFLOW 0x0504 +#define GL_STATIC_COPY 0x88E6 #define GL_STATIC_COPY_ARB 0x88E6 +#define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ 0x88E5 #define GL_STATIC_READ_ARB 0x88E5 #define GL_STENCIL 0x1802 #define GL_STENCIL_ATTACHMENT 0x8D20 #define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 #define GL_STENCIL_BITS 0x0D57 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_COMPONENTS 0x8285 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_INDEX 0x1901 @@ -1149,14 +2012,25 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_RENDERABLE 0x8288 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_WRITEMASK 0x0B98 #define GL_STEREO 0x0C33 +#define GL_STREAM_COPY 0x88E2 #define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STREAM_DRAW 0x88E0 #define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ 0x88E1 #define GL_STREAM_READ_ARB 0x88E1 #define GL_SUBPIXEL_BITS 0x0D50 +#define GL_SUBTRACT 0x84E7 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_SYNC_STATUS 0x9114 #define GL_T 0x2001 #define GL_T2F_C3F_V3F 0x2A2A #define GL_T2F_C4F_N3F_V3F 0x2A2C @@ -1166,59 +2040,138 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_T4F_C4F_N3F_V4F 0x2A2D #define GL_T4F_V4F 0x2A28 #define GL_TABLE_TOO_LARGE 0x8031 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_CONTROL_SHADER 0x8E88 #define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_SHADER 0x8E87 #define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TEXTURE 0x1702 +#define GL_TEXTURE0 0x84C0 #define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE10 0x84CA #define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11 0x84CB #define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12 0x84CC #define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13 0x84CD #define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14 0x84CE #define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15 0x84CF #define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16 0x84D0 #define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17 0x84D1 #define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18 0x84D2 #define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19 0x84D3 #define GL_TEXTURE19_ARB 0x84D3 #define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE20 0x84D4 #define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21 0x84D5 #define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22 0x84D6 #define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23 0x84D7 #define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24 0x84D8 #define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25 0x84D9 #define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26 0x84DA #define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27 0x84DB #define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28 0x84DC #define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29 0x84DD #define GL_TEXTURE29_ARB 0x84DD #define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE30 0x84DE #define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31 0x84DF #define GL_TEXTURE31_ARB 0x84DF #define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4 0x84C4 #define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5 0x84C5 #define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6 0x84C6 #define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7 0x84C7 #define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8 0x84C8 #define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9 0x84C9 #define GL_TEXTURE9_ARB 0x84C9 #define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_1D_ARRAY 0x8C18 #define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 #define GL_TEXTURE_1D_BINDING_EXT 0x8068 #define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_2D_ARRAY 0x8C1A #define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A #define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_TEXTURE_3D 0x806F #define GL_TEXTURE_3D_BINDING_EXT 0x806A #define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_BASE_LEVEL 0x813C #define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C #define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C #define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D #define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_TEXTURE_BIT 0x00040000 #define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_BORDER 0x1005 #define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B #define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 @@ -1230,63 +2183,224 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A #define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 #define GL_TEXTURE_ENV 0x2300 #define GL_TEXTURE_ENV_COLOR 0x2201 #define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_TEXTURE_GEN_MODE 0x2500 #define GL_TEXTURE_GEN_Q 0x0C63 #define GL_TEXTURE_GEN_R 0x0C62 #define GL_TEXTURE_GEN_S 0x0C60 #define GL_TEXTURE_GEN_T 0x0C61 #define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_TEXTURE_MAX_LOD 0x813B #define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_MIN_LOD 0x813A #define GL_TEXTURE_PRIORITY 0x8066 #define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RECTANGLE 0x84F5 #define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_RESIDENT 0x8067 #define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TEXTURE_STACK_DEPTH 0x0BA5 #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TEXTURE_TARGET 0x1006 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_WRAP_R 0x8072 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_TIMESTAMP 0x8E28 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D #define GL_TRACK_MATRIX_NV 0x8648 #define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 #define GL_TRANSFORM_BIT 0x00001000 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 #define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 #define GL_TRANSPOSE_NV 0x862C +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 #define GL_TRIANGLES 0x0004 +#define GL_TRIANGLES_ADJACENCY 0x000C #define GL_TRIANGLES_ADJACENCY_ARB 0x000C #define GL_TRIANGLES_ADJACENCY_EXT 0x000C #define GL_TRIANGLE_FAN 0x0006 #define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D #define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D #define GL_TRUE 1 +#define GL_TYPE 0x92FA +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 #define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_IMAGES 0x806D #define GL_UNPACK_SKIP_PIXELS 0x0CF4 #define GL_UNPACK_SKIP_ROWS 0x0CF3 #define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNSIGNALED 0x9118 #define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 #define GL_UNSIGNED_INT 0x1405 +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 #define GL_UNSIGNED_INT_24_8 0x84FA #define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 #define GL_UNSIGNED_NORMALIZED 0x8C17 #define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UPPER_LEFT 0x8CA2 #define GL_V2F 0x2A20 #define GL_V3F 0x2A21 +#define GL_VALIDATE_STATUS 0x8B83 #define GL_VENDOR 0x1F00 #define GL_VERSION 0x1F02 #define GL_VERTEX_ARRAY 0x8074 +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 #define GL_VERTEX_ARRAY_COUNT_EXT 0x807D #define GL_VERTEX_ARRAY_EXT 0x8074 @@ -1314,37 +2428,99 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 #define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 #define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 #define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_VERTEX_PROGRAM_ARB 0x8620 #define GL_VERTEX_PROGRAM_BINDING_NV 0x864A #define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 #define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 #define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 #define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_VERTEX_SHADER 0x8B31 #define GL_VERTEX_SHADER_ARB 0x8B31 #define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 #define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_VERTEX_TEXTURE 0x829B +#define GL_VERTICES_SUBMITTED 0x82EE #define GL_VIEWPORT 0x0BA2 #define GL_VIEWPORT_BIT 0x00000800 +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393 +#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390 +#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391 +#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392 +#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394 +#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395 +#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388 +#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389 +#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A +#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B +#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C +#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D +#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E +#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_EAC_R11 0x9383 +#define GL_VIEW_CLASS_EAC_RG11 0x9384 +#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387 +#define GL_VIEW_CLASS_ETC2_RGB 0x9385 +#define GL_VIEW_CLASS_ETC2_RGBA 0x9386 +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_WAIT_FAILED 0x911D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E #define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_WRITE_ONLY 0x88B9 #define GL_WRITE_ONLY_ARB 0x88B9 #define GL_XOR 0x1506 #define GL_ZERO 0 +#define GL_ZERO_TO_ONE 0x935F #define GL_ZOOM_X 0x0D16 #define GL_ZOOM_Y 0x0D17 -#define GL_ACTIVE_TEXTURE 0x84E0 -#define GL_ADD_SIGNED 0x8574 -#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_BLEND_DST_ALPHA_OES 0x80CA #define GL_BLEND_DST_RGB_OES 0x80C8 #define GL_BLEND_EQUATION_ALPHA_OES 0x883D @@ -1352,29 +2528,13 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_BLEND_EQUATION_RGB_OES 0x8009 #define GL_BLEND_SRC_ALPHA_OES 0x80CB #define GL_BLEND_SRC_RGB_OES 0x80C9 -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 -#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 #define GL_COLOR_ATTACHMENT0_OES 0x8CE0 -#define GL_COMBINE 0x8570 -#define GL_COMBINE_ALPHA 0x8572 -#define GL_COMBINE_RGB 0x8571 -#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 -#define GL_CONSTANT 0x8576 #define GL_DEPTH24_STENCIL8_OES 0x88F0 #define GL_DEPTH_ATTACHMENT_OES 0x8D00 #define GL_DEPTH_COMPONENT16_OES 0x81A5 #define GL_DEPTH_COMPONENT24_OES 0x81A6 #define GL_DEPTH_COMPONENT32_OES 0x81A7 #define GL_DEPTH_STENCIL_OES 0x84F9 -#define GL_DOT3_RGB 0x86AE -#define GL_DOT3_RGBA 0x86AF -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_FIXED 0x140C #define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1 #define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0 @@ -1391,28 +2551,9 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FUNC_ADD_OES 0x8006 #define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B #define GL_FUNC_SUBTRACT_OES 0x800A -#define GL_GENERATE_MIPMAP 0x8191 -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_INTERPOLATE 0x8575 #define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506 #define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8 -#define GL_MAX_TEXTURE_UNITS 0x84E2 -#define GL_MULTISAMPLE 0x809D #define GL_NONE_OES 0 -#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 -#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 -#define GL_OPERAND0_ALPHA 0x8598 -#define GL_OPERAND0_RGB 0x8590 -#define GL_OPERAND1_ALPHA 0x8599 -#define GL_OPERAND1_RGB 0x8591 -#define GL_OPERAND2_ALPHA 0x859A -#define GL_OPERAND2_RGB 0x8592 -#define GL_POINT_DISTANCE_ATTENUATION 0x8129 -#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 -#define GL_POINT_SIZE_MAX 0x8127 -#define GL_POINT_SIZE_MIN 0x8126 -#define GL_PREVIOUS 0x8578 -#define GL_PRIMARY_COLOR 0x8577 #define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53 #define GL_RENDERBUFFER_BINDING_OES 0x8CA7 #define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52 @@ -1424,76 +2565,14 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50 #define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55 #define GL_RENDERBUFFER_WIDTH_OES 0x8D42 -#define GL_RESCALE_NORMAL 0x803A #define GL_RGB565_OES 0x8D62 #define GL_RGB5_A1_OES 0x8057 #define GL_RGBA4_OES 0x8056 -#define GL_RGB_SCALE 0x8573 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE 0x809F -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 -#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 -#define GL_SOURCE0_ALPHA 0x8588 -#define GL_SOURCE0_RGB 0x8580 -#define GL_SOURCE1_ALPHA 0x8589 -#define GL_SOURCE1_RGB 0x8581 -#define GL_SOURCE2_ALPHA 0x858A -#define GL_SOURCE2_RGB 0x8582 -#define GL_SRC0_ALPHA 0x8588 -#define GL_SRC0_RGB 0x8580 -#define GL_SRC1_ALPHA 0x8589 -#define GL_SRC1_RGB 0x8581 -#define GL_SRC2_ALPHA 0x858A -#define GL_SRC2_RGB 0x8582 -#define GL_STATIC_DRAW 0x88E4 #define GL_STENCIL_ATTACHMENT_OES 0x8D20 -#define GL_SUBTRACT 0x84E7 -#define GL_TEXTURE0 0x84C0 -#define GL_TEXTURE1 0x84C1 -#define GL_TEXTURE10 0x84CA -#define GL_TEXTURE11 0x84CB -#define GL_TEXTURE12 0x84CC -#define GL_TEXTURE13 0x84CD -#define GL_TEXTURE14 0x84CE -#define GL_TEXTURE15 0x84CF -#define GL_TEXTURE16 0x84D0 -#define GL_TEXTURE17 0x84D1 -#define GL_TEXTURE18 0x84D2 -#define GL_TEXTURE19 0x84D3 -#define GL_TEXTURE2 0x84C2 -#define GL_TEXTURE20 0x84D4 -#define GL_TEXTURE21 0x84D5 -#define GL_TEXTURE22 0x84D6 -#define GL_TEXTURE23 0x84D7 -#define GL_TEXTURE24 0x84D8 -#define GL_TEXTURE25 0x84D9 -#define GL_TEXTURE26 0x84DA -#define GL_TEXTURE27 0x84DB -#define GL_TEXTURE28 0x84DC -#define GL_TEXTURE29 0x84DD -#define GL_TEXTURE3 0x84C3 -#define GL_TEXTURE30 0x84DE -#define GL_TEXTURE31 0x84DF -#define GL_TEXTURE4 0x84C4 -#define GL_TEXTURE5 0x84C5 -#define GL_TEXTURE6 0x84C6 -#define GL_TEXTURE7 0x84C7 -#define GL_TEXTURE8 0x84C8 -#define GL_TEXTURE9 0x84C9 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A #define GL_UNSIGNED_INT_24_8_OES 0x84FA -#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 #define GL_VERSION_ES_CL_1_0 1 #define GL_VERSION_ES_CL_1_1 1 #define GL_VERSION_ES_CM_1_1 1 -#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 #ifndef __khrplatform_h_ @@ -1617,7 +2696,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro * This follows the return type of the function and precedes the function * name in the function prototype. */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(KHRONOS_STATIC) +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) /* Win32 but not WinCE */ # define KHRONOS_GLAD_API_PTR __stdcall #else @@ -1786,104 +2865,279 @@ typedef enum { } khronos_boolean_enum_t; #endif /* __khrplatform_h_ */ + typedef unsigned int GLenum; + typedef unsigned char GLboolean; + typedef unsigned int GLbitfield; + typedef void GLvoid; + typedef khronos_int8_t GLbyte; + typedef khronos_uint8_t GLubyte; + typedef khronos_int16_t GLshort; + typedef khronos_uint16_t GLushort; + typedef int GLint; + typedef unsigned int GLuint; + typedef khronos_int32_t GLclampx; + typedef int GLsizei; + typedef khronos_float_t GLfloat; + typedef khronos_float_t GLclampf; + typedef double GLdouble; + typedef double GLclampd; + typedef void *GLeglClientBufferEXT; + typedef void *GLeglImageOES; + typedef char GLchar; + typedef char GLcharARB; + #ifdef __APPLE__ typedef void *GLhandleARB; #else typedef unsigned int GLhandleARB; #endif + typedef khronos_uint16_t GLhalf; + typedef khronos_uint16_t GLhalfARB; + typedef khronos_int32_t GLfixed; + #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef khronos_intptr_t GLintptr; #else typedef khronos_intptr_t GLintptr; #endif + #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef khronos_intptr_t GLintptrARB; #else typedef khronos_intptr_t GLintptrARB; #endif + #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef khronos_ssize_t GLsizeiptr; #else typedef khronos_ssize_t GLsizeiptr; #endif + #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) typedef khronos_ssize_t GLsizeiptrARB; #else typedef khronos_ssize_t GLsizeiptrARB; #endif + typedef khronos_int64_t GLint64; + typedef khronos_int64_t GLint64EXT; + typedef khronos_uint64_t GLuint64; + typedef khronos_uint64_t GLuint64EXT; + typedef struct __GLsync *GLsync; + struct _cl_context; + struct _cl_event; -typedef void ( *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void ( *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void ( *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); -typedef void ( *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); + +typedef void (GLAD_API_PTR *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + +typedef void (GLAD_API_PTR *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + +typedef void (GLAD_API_PTR *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); + +typedef void (GLAD_API_PTR *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); + typedef unsigned short GLhalfNV; + typedef GLintptr GLvdpauSurfaceNV; -typedef void ( *GLVULKANPROCNV)(void); + +typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); + #define GL_VERSION_1_0 1 GLAD_API_CALL int SF_GLAD_GL_VERSION_1_0; #define GL_VERSION_1_1 1 GLAD_API_CALL int SF_GLAD_GL_VERSION_1_1; +#define GL_VERSION_1_2 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_1_2; +#define GL_VERSION_1_3 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_1_3; +#define GL_VERSION_1_4 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_1_4; +#define GL_VERSION_1_5 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_1_5; +#define GL_VERSION_2_0 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_2_0; +#define GL_VERSION_2_1 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_2_1; +#define GL_VERSION_3_0 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_3_0; +#define GL_VERSION_3_1 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_3_1; +#define GL_VERSION_3_2 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_3_2; +#define GL_VERSION_3_3 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_3_3; +#define GL_VERSION_4_0 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_0; +#define GL_VERSION_4_1 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_1; +#define GL_VERSION_4_2 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_2; +#define GL_VERSION_4_3 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_3; +#define GL_VERSION_4_4 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_4; +#define GL_VERSION_4_5 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_5; +#define GL_VERSION_4_6 1 +GLAD_API_CALL int SF_GLAD_GL_VERSION_4_6; #define GL_VERSION_ES_CM_1_0 1 GLAD_API_CALL int SF_GLAD_GL_VERSION_ES_CM_1_0; +#define GL_ARB_ES2_compatibility 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_ES2_compatibility; +#define GL_ARB_ES3_1_compatibility 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_ES3_1_compatibility; +#define GL_ARB_base_instance 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_base_instance; +#define GL_ARB_blend_func_extended 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_blend_func_extended; +#define GL_ARB_buffer_storage 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_buffer_storage; +#define GL_ARB_clear_buffer_object 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_clear_buffer_object; +#define GL_ARB_clear_texture 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_clear_texture; +#define GL_ARB_clip_control 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_clip_control; +#define GL_ARB_compute_shader 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_compute_shader; #define GL_ARB_copy_buffer 1 GLAD_API_CALL int SF_GLAD_GL_ARB_copy_buffer; +#define GL_ARB_copy_image 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_copy_image; +#define GL_ARB_direct_state_access 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_direct_state_access; +#define GL_ARB_draw_elements_base_vertex 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_draw_elements_base_vertex; +#define GL_ARB_draw_indirect 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_draw_indirect; +#define GL_ARB_fragment_program 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_fragment_program; #define GL_ARB_fragment_shader 1 GLAD_API_CALL int SF_GLAD_GL_ARB_fragment_shader; +#define GL_ARB_framebuffer_no_attachments 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_framebuffer_no_attachments; #define GL_ARB_framebuffer_object 1 GLAD_API_CALL int SF_GLAD_GL_ARB_framebuffer_object; #define GL_ARB_geometry_shader4 1 GLAD_API_CALL int SF_GLAD_GL_ARB_geometry_shader4; #define GL_ARB_get_program_binary 1 GLAD_API_CALL int SF_GLAD_GL_ARB_get_program_binary; +#define GL_ARB_get_texture_sub_image 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_get_texture_sub_image; +#define GL_ARB_gpu_shader_fp64 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_gpu_shader_fp64; #define GL_ARB_imaging 1 GLAD_API_CALL int SF_GLAD_GL_ARB_imaging; +#define GL_ARB_internalformat_query 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_internalformat_query; +#define GL_ARB_internalformat_query2 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_internalformat_query2; +#define GL_ARB_invalidate_subdata 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_invalidate_subdata; +#define GL_ARB_map_buffer_range 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_map_buffer_range; +#define GL_ARB_multi_bind 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_multi_bind; +#define GL_ARB_multi_draw_indirect 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_multi_draw_indirect; #define GL_ARB_multitexture 1 GLAD_API_CALL int SF_GLAD_GL_ARB_multitexture; +#define GL_ARB_polygon_offset_clamp 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_polygon_offset_clamp; +#define GL_ARB_program_interface_query 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_program_interface_query; +#define GL_ARB_provoking_vertex 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_provoking_vertex; +#define GL_ARB_sampler_objects 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_sampler_objects; #define GL_ARB_separate_shader_objects 1 GLAD_API_CALL int SF_GLAD_GL_ARB_separate_shader_objects; +#define GL_ARB_shader_atomic_counters 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_shader_atomic_counters; +#define GL_ARB_shader_image_load_store 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_shader_image_load_store; #define GL_ARB_shader_objects 1 GLAD_API_CALL int SF_GLAD_GL_ARB_shader_objects; +#define GL_ARB_shader_storage_buffer_object 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_shader_storage_buffer_object; +#define GL_ARB_shader_subroutine 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_shader_subroutine; #define GL_ARB_shading_language_100 1 GLAD_API_CALL int SF_GLAD_GL_ARB_shading_language_100; +#define GL_ARB_sync 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_sync; +#define GL_ARB_tessellation_shader 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_tessellation_shader; +#define GL_ARB_texture_barrier 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_texture_barrier; +#define GL_ARB_texture_buffer_range 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_texture_buffer_range; +#define GL_ARB_texture_multisample 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_texture_multisample; #define GL_ARB_texture_non_power_of_two 1 GLAD_API_CALL int SF_GLAD_GL_ARB_texture_non_power_of_two; +#define GL_ARB_texture_storage 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_texture_storage; +#define GL_ARB_texture_storage_multisample 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_texture_storage_multisample; +#define GL_ARB_texture_view 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_texture_view; +#define GL_ARB_timer_query 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_timer_query; +#define GL_ARB_transform_feedback2 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_transform_feedback2; +#define GL_ARB_transform_feedback3 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_transform_feedback3; +#define GL_ARB_transform_feedback_instanced 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_transform_feedback_instanced; +#define GL_ARB_uniform_buffer_object 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_uniform_buffer_object; +#define GL_ARB_vertex_array_object 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_array_object; +#define GL_ARB_vertex_attrib_64bit 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_attrib_64bit; +#define GL_ARB_vertex_attrib_binding 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_attrib_binding; #define GL_ARB_vertex_buffer_object 1 GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_buffer_object; #define GL_ARB_vertex_program 1 GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_program; #define GL_ARB_vertex_shader 1 GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_shader; +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev; +#define GL_ARB_viewport_array 1 +GLAD_API_CALL int SF_GLAD_GL_ARB_viewport_array; #define GL_EXT_blend_equation_separate 1 GLAD_API_CALL int SF_GLAD_GL_EXT_blend_equation_separate; #define GL_EXT_blend_func_separate 1 @@ -1918,11 +3172,15 @@ GLAD_API_CALL int SF_GLAD_GL_EXT_vertex_array; GLAD_API_CALL int SF_GLAD_GL_INGR_blend_func_separate; #define GL_KHR_debug 1 GLAD_API_CALL int SF_GLAD_GL_KHR_debug; +#define GL_KHR_robustness 1 +GLAD_API_CALL int SF_GLAD_GL_KHR_robustness; #define GL_NV_geometry_program4 1 GLAD_API_CALL int SF_GLAD_GL_NV_geometry_program4; #define GL_NV_vertex_program 1 GLAD_API_CALL int SF_GLAD_GL_NV_vertex_program; -#define GL_SGIS_texture_edge_clamp 1 +#define GL_OES_single_precision 1 +GLAD_API_CALL int SF_GLAD_GL_OES_single_precision; +#define GL_SGIS_texture_edge_clamp 1 GLAD_API_CALL int SF_GLAD_GL_SGIS_texture_edge_clamp; #define GL_EXT_sRGB 1 GLAD_API_CALL int SF_GLAD_GL_EXT_sRGB; @@ -1940,8 +3198,6 @@ GLAD_API_CALL int SF_GLAD_GL_OES_depth32; GLAD_API_CALL int SF_GLAD_GL_OES_framebuffer_object; #define GL_OES_packed_depth_stencil 1 GLAD_API_CALL int SF_GLAD_GL_OES_packed_depth_stencil; -#define GL_OES_single_precision 1 -GLAD_API_CALL int SF_GLAD_GL_OES_single_precision; #define GL_OES_texture_npot 1 GLAD_API_CALL int SF_GLAD_GL_OES_texture_npot; @@ -1959,48 +3215,95 @@ typedef void (GLAD_API_PTR *PFNGLARRAYELEMENTEXTPROC)(GLint i); typedef void (GLAD_API_PTR *PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj); typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); typedef void (GLAD_API_PTR *PFNGLBEGINPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, GLuint index, const GLcharARB * name); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERARBPROC)(GLenum target, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSBASEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLBINDBUFFERSRANGEPROC)(GLenum target, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizeiptr * sizes); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMARBPROC)(GLenum target, GLuint program); typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMNVPROC)(GLenum target, GLuint id); typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERSPROC)(GLuint first, GLsizei count, const GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREEXTPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREUNITPROC)(GLuint unit, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTEXTURESPROC)(GLuint first, GLsizei count, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERSPROC)(GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); typedef void (GLAD_API_PTR *PFNGLBITMAPPROC)(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte * bitmap); typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONEXTPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEINGRPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst); typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (GLAD_API_PTR *PFNGLBLITNAMEDFRAMEBUFFERPROC)(GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); typedef void (GLAD_API_PTR *PFNGLBUFFERDATAARBPROC)(GLenum target, GLsizeiptrARB size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLBUFFERSTORAGEPROC)(GLenum target, GLsizeiptr size, const void * data, GLbitfield flags); typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void * data); typedef void (GLAD_API_PTR *PFNGLCALLLISTPROC)(GLuint list); typedef void (GLAD_API_PTR *PFNGLCALLLISTSPROC)(GLsizei n, GLenum type, const void * lists); typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target); +typedef GLenum (GLAD_API_PTR *PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)(GLuint framebuffer, GLenum target); +typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLCLEARACCUMPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth); typedef void (GLAD_API_PTR *PFNGLCLEARINDEXPROC)(GLfloat c); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERDATAPROC)(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)(GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARTEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREPROC)(GLenum texture); typedef void (GLAD_API_PTR *PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture); +typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLCLIPCONTROLPROC)(GLenum origin, GLenum depth); typedef void (GLAD_API_PTR *PFNGLCLIPPLANEPROC)(GLenum plane, const GLdouble * equation); +typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation); typedef void (GLAD_API_PTR *PFNGLCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); typedef void (GLAD_API_PTR *PFNGLCOLOR3BVPROC)(const GLbyte * v); typedef void (GLAD_API_PTR *PFNGLCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); @@ -2034,7 +3337,12 @@ typedef void (GLAD_API_PTR *PFNGLCOLOR4UIVPROC)(const GLuint * v); typedef void (GLAD_API_PTR *PFNGLCOLOR4USPROC)(GLushort red, GLushort green, GLushort blue, GLushort alpha); typedef void (GLAD_API_PTR *PFNGLCOLOR4USVPROC)(const GLushort * v); typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAD_API_PTR *PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); typedef void (GLAD_API_PTR *PFNGLCOLORMATERIALPROC)(GLenum face, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint * color); typedef void (GLAD_API_PTR *PFNGLCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLCOLORPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); typedef void (GLAD_API_PTR *PFNGLCOLORSUBTABLEPROC)(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void * data); @@ -2043,6 +3351,15 @@ typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenu typedef void (GLAD_API_PTR *PFNGLCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); +typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void * image); typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * image); typedef void (GLAD_API_PTR *PFNGLCONVOLUTIONPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat params); @@ -2054,6 +3371,8 @@ typedef void (GLAD_API_PTR *PFNGLCOPYCOLORSUBTABLEPROC)(GLenum target, GLsizei s typedef void (GLAD_API_PTR *PFNGLCOPYCOLORTABLEPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER1DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); typedef void (GLAD_API_PTR *PFNGLCOPYCONVOLUTIONFILTER2DPROC)(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (GLAD_API_PTR *PFNGLCOPYNAMEDBUFFERSUBDATAPROC)(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLCOPYPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DEXTPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); @@ -2065,11 +3384,23 @@ typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint lev typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCOPYTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLCREATEBUFFERSPROC)(GLsizei n, GLuint * buffers); +typedef void (GLAD_API_PTR *PFNGLCREATEFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATEPROGRAMOBJECTARBPROC)(void); +typedef void (GLAD_API_PTR *PFNGLCREATEPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); +typedef void (GLAD_API_PTR *PFNGLCREATEQUERIESPROC)(GLenum target, GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLCREATERENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLCREATESAMPLERSPROC)(GLsizei n, GLuint * samplers); typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); typedef GLhandleARB (GLAD_API_PTR *PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType); typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings); +typedef void (GLAD_API_PTR *PFNGLCREATETEXTURESPROC)(GLenum target, GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLCREATETRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLCREATEVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam); typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); @@ -2080,37 +3411,76 @@ typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLDELETELISTSPROC)(GLuint list, GLsizei range); typedef void (GLAD_API_PTR *PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint * programs); typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMSNVPROC)(GLsizei n, const GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); +typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); +typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESEXTPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYDVNVPROC)(GLuint first, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDDNVPROC)(GLuint index, GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f); typedef void (GLAD_API_PTR *PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj); typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLDISABLECLIENTSTATEPROC)(GLenum array); +typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSEXTPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); +typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLDRAWPIXELSPROC)(GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); +typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPROC)(GLboolean flag); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTERPROC)(GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGPOINTEREXTPROC)(GLsizei stride, GLsizei count, const GLboolean * pointer); typedef void (GLAD_API_PTR *PFNGLEDGEFLAGVPROC)(const GLboolean * flag); typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLENABLECLIENTSTATEPROC)(GLenum array); +typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXARRAYATTRIBPROC)(GLuint vaobj, GLuint index); typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLENDPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); typedef void (GLAD_API_PTR *PFNGLENDLISTPROC)(void); +typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DPROC)(GLdouble u); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1DVPROC)(const GLdouble * u); typedef void (GLAD_API_PTR *PFNGLEVALCOORD1FPROC)(GLfloat u); @@ -2125,12 +3495,21 @@ typedef void (GLAD_API_PTR *PFNGLEVALPOINT1PROC)(GLint i); typedef void (GLAD_API_PTR *PFNGLEVALPOINT2PROC)(GLint i, GLint j); typedef void (GLAD_API_PTR *PFNGLEXECUTEPROGRAMNVPROC)(GLenum target, GLuint id, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLFEEDBACKBUFFERPROC)(GLsizei size, GLenum type, GLfloat * buffer); +typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDPROC)(GLdouble coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDDVPROC)(const GLdouble * coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFPROC)(GLfloat coord); +typedef void (GLAD_API_PTR *PFNGLFOGCOORDFVPROC)(const GLfloat * coord); typedef void (GLAD_API_PTR *PFNGLFOGFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLFOGFVPROC)(GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLFOGIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLFOGIVPROC)(GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); @@ -2149,6 +3528,7 @@ typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLFRUSTUMPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLGENBUFFERSARBPROC)(GLsizei n, GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); @@ -2157,20 +3537,36 @@ typedef GLuint (GLAD_API_PTR *PFNGLGENLISTSPROC)(GLsizei range); typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSARBPROC)(GLsizei n, GLuint * programs); typedef void (GLAD_API_PTR *PFNGLGENPROGRAMSNVPROC)(GLsizei n, GLuint * programs); +typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint * renderbuffers); +typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); typedef void (GLAD_API_PTR *PFNGLGENTEXTURESEXTPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); +typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPEXTPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGENERATETEXTUREMIPMAPPROC)(GLuint texture); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei * length, GLint * size, GLenum * type, GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformName); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, GLsizei maxCount, GLsizei * count, GLhandleARB * obj); +typedef void (GLAD_API_PTR *PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei * count, GLuint * shaders); typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar * name); typedef GLint (GLAD_API_PTR *PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean * data); typedef void (GLAD_API_PTR *PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean * data); +typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 * params); typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); @@ -2178,24 +3574,39 @@ typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data); typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEPROC)(GLenum plane, GLdouble * equation); +typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation); typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, void * table); typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETCOLORTABLEPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void * pixels); typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, void * image); typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETCONVOLUTIONPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble * data); typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat * data); typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef GLenum (GLAD_API_PTR *PFNGLGETGRAPHICSRESETSTATUSPROC)(void); typedef GLhandleARB (GLAD_API_PTR *PFNGLGETHANDLEARBPROC)(GLenum pname); typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETHISTOGRAMPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); +typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETLIGHTFVPROC)(GLenum light, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETLIGHTIVPROC)(GLenum light, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETMAPDVPROC)(GLenum target, GLenum query, GLdouble * v); @@ -2206,6 +3617,14 @@ typedef void (GLAD_API_PTR *PFNGLGETMATERIALIVPROC)(GLenum face, GLenum pname, G typedef void (GLAD_API_PTR *PFNGLGETMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, void * values); typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETMINMAXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)(GLuint buffer, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPARAMETERIVPROC)(GLuint buffer, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERPOINTERVPROC)(GLuint buffer, GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, void * data); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLuint framebuffer, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)(GLuint framebuffer, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)(GLuint renderbuffer, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint * params); @@ -2219,22 +3638,52 @@ typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERDVNVPROC)(GLenum target, GLuint index, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPARAMETERFVNVPROC)(GLenum target, GLuint index, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params); +typedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei count, GLsizei * length, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, void * string); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTRINGNVPROC)(GLuint id, GLenum pname, GLubyte * program); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVNVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUI64VPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYBUFFEROBJECTUIVPROC)(GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, void * row, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, GLsizei maxLength, GLsizei * length, GLcharARB * source); +typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); +typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +typedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETTEXENVFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETTEXENVIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETTEXGENDVPROC)(GLenum coord, GLenum pname, GLdouble * params); @@ -2243,15 +3692,40 @@ typedef void (GLAD_API_PTR *PFNGLGETTEXGENIVPROC)(GLenum coord, GLenum pname, GL typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint * params); typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREIMAGEPROC)(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERFVPROC)(GLuint texture, GLint level, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURELEVELPARAMETERIVPROC)(GLuint texture, GLint level, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTEXTURESUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void * pixels); typedef void (GLAD_API_PTR *PFNGLGETTRACKMATRIXIVNVPROC)(GLenum target, GLuint address, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI64_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint64 * param); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKI_VPROC)(GLuint xfb, GLenum pname, GLuint index, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKIVPROC)(GLuint xfb, GLenum pname, GLint * param); +typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB * name); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXED64IVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint64 * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYINDEXEDIVPROC)(GLuint vaobj, GLuint index, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXARRAYIVPROC)(GLuint vaobj, GLenum pname, GLint * param); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, void ** pointer); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVNVPROC)(GLuint index, GLenum pname, void ** pointer); @@ -2264,6 +3738,24 @@ typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVNVPROC)(GLuint index, GLenum p typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVNVPROC)(GLuint index, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNCOLORTABLEPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * table); +typedef void (GLAD_API_PTR *PFNGLGETNCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint lod, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETNCONVOLUTIONFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void * image); +typedef void (GLAD_API_PTR *PFNGLGETNHISTOGRAMPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); +typedef void (GLAD_API_PTR *PFNGLGETNMAPDVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPFVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLGETNMAPIVPROC)(GLenum target, GLenum query, GLsizei bufSize, GLint * v); +typedef void (GLAD_API_PTR *PFNGLGETNMINMAXPROC)(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPFVPROC)(GLenum map, GLsizei bufSize, GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUIVPROC)(GLenum map, GLsizei bufSize, GLuint * values); +typedef void (GLAD_API_PTR *PFNGLGETNPIXELMAPUSVPROC)(GLenum map, GLsizei bufSize, GLushort * values); +typedef void (GLAD_API_PTR *PFNGLGETNPOLYGONSTIPPLEPROC)(GLsizei bufSize, GLubyte * pattern); +typedef void (GLAD_API_PTR *PFNGLGETNSEPARABLEFILTERPROC)(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void * row, GLsizei columnBufSize, void * column, void * span); +typedef void (GLAD_API_PTR *PFNGLGETNTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void * pixels); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMDVPROC)(GLuint program, GLint location, GLsizei bufSize, GLdouble * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMFVPROC)(GLuint program, GLint location, GLsizei bufSize, GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETNUNIFORMUIVPROC)(GLuint program, GLint location, GLsizei bufSize, GLuint * params); typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); typedef void (GLAD_API_PTR *PFNGLHISTOGRAMPROC)(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); typedef void (GLAD_API_PTR *PFNGLINDEXMASKPROC)(GLuint mask); @@ -2281,19 +3773,35 @@ typedef void (GLAD_API_PTR *PFNGLINDEXUBPROC)(GLubyte c); typedef void (GLAD_API_PTR *PFNGLINDEXUBVPROC)(const GLubyte * c); typedef void (GLAD_API_PTR *PFNGLINITNAMESPROC)(void); typedef void (GLAD_API_PTR *PFNGLINTERLEAVEDARRAYSPROC)(GLenum format, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)(GLuint framebuffer, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERARBPROC)(GLuint buffer); typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); +typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer); typedef GLboolean (GLAD_API_PTR *PFNGLISLISTPROC)(GLuint list); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMARBPROC)(GLuint program); typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMNVPROC)(GLuint id); typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); +typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer); +typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); +typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); +typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREEXTPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); +typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELFVPROC)(GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLLIGHTMODELIPROC)(GLenum pname, GLint param); @@ -2312,6 +3820,8 @@ typedef void (GLAD_API_PTR *PFNGLLOADMATRIXDPROC)(const GLdouble * m); typedef void (GLAD_API_PTR *PFNGLLOADMATRIXFPROC)(const GLfloat * m); typedef void (GLAD_API_PTR *PFNGLLOADNAMEPROC)(GLuint name); typedef void (GLAD_API_PTR *PFNGLLOADPROGRAMNVPROC)(GLenum target, GLuint id, GLsizei len, const GLubyte * program); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLLOADTRANSPOSEMATRIXFPROC)(const GLfloat * m); typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); typedef void (GLAD_API_PTR *PFNGLMAP1DPROC)(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble * points); typedef void (GLAD_API_PTR *PFNGLMAP1FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat * points); @@ -2319,18 +3829,33 @@ typedef void (GLAD_API_PTR *PFNGLMAP2DPROC)(GLenum target, GLdouble u1, GLdouble typedef void (GLAD_API_PTR *PFNGLMAP2FPROC)(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat * points); typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERARBPROC)(GLenum target, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAD_API_PTR *PFNGLMAPGRID1DPROC)(GLint un, GLdouble u1, GLdouble u2); typedef void (GLAD_API_PTR *PFNGLMAPGRID1FPROC)(GLint un, GLfloat u1, GLfloat u2); typedef void (GLAD_API_PTR *PFNGLMAPGRID2DPROC)(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); typedef void (GLAD_API_PTR *PFNGLMAPGRID2FPROC)(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERPROC)(GLuint buffer, GLenum access); +typedef void * (GLAD_API_PTR *PFNGLMAPNAMEDBUFFERRANGEPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); typedef void (GLAD_API_PTR *PFNGLMATERIALFPROC)(GLenum face, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLMATERIALFVPROC)(GLenum face, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLMATERIALIPROC)(GLenum face, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLMATERIALIVPROC)(GLenum face, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLMATRIXMODEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERBYREGIONPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat value); typedef void (GLAD_API_PTR *PFNGLMINMAXPROC)(GLenum target, GLenum internalformat, GLboolean sink); typedef void (GLAD_API_PTR *PFNGLMULTMATRIXDPROC)(const GLdouble * m); typedef void (GLAD_API_PTR *PFNGLMULTMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXDPROC)(const GLdouble * m); +typedef void (GLAD_API_PTR *PFNGLMULTTRANSPOSEMATRIXFPROC)(const GLfloat * m); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC)(GLenum mode, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC)(GLenum mode, GLenum type, const void * indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DPROC)(GLenum target, GLdouble s); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DARBPROC)(GLenum target, GLdouble s); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD1DVPROC)(GLenum target, const GLdouble * v); @@ -2395,6 +3920,26 @@ typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SPROC)(GLenum target, GLshort s, typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SARBPROC)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVPROC)(GLenum target, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERDATAPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLenum usage); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSTORAGEPROC)(GLuint buffer, GLsizeiptr size, const void * data, GLbitfield flags); +typedef void (GLAD_API_PTR *PFNGLNAMEDBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr size, const void * data); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)(GLuint framebuffer, GLenum buf); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)(GLuint framebuffer, GLsizei n, const GLenum * bufs); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)(GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)(GLuint framebuffer, GLenum src); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEPROC)(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLNEWLISTPROC)(GLuint list, GLenum mode); typedef void (GLAD_API_PTR *PFNGLNORMAL3BPROC)(GLbyte nx, GLbyte ny, GLbyte nz); typedef void (GLAD_API_PTR *PFNGLNORMAL3BVPROC)(const GLbyte * v); @@ -2406,12 +3951,18 @@ typedef void (GLAD_API_PTR *PFNGLNORMAL3IPROC)(GLint nx, GLint ny, GLint nz); typedef void (GLAD_API_PTR *PFNGLNORMAL3IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLNORMAL3SPROC)(GLshort nx, GLshort ny, GLshort nz); typedef void (GLAD_API_PTR *PFNGLNORMAL3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLNORMALPOINTERPROC)(GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLNORMALPOINTEREXTPROC)(GLenum type, GLsizei stride, GLsizei count, const void * pointer); typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label); typedef void (GLAD_API_PTR *PFNGLORTHOPROC)(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (GLAD_API_PTR *PFNGLPASSTHROUGHPROC)(GLfloat token); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLPIXELMAPFVPROC)(GLenum map, GLsizei mapsize, const GLfloat * values); typedef void (GLAD_API_PTR *PFNGLPIXELMAPUIVPROC)(GLenum map, GLsizei mapsize, const GLuint * values); typedef void (GLAD_API_PTR *PFNGLPIXELMAPUSVPROC)(GLenum map, GLsizei mapsize, const GLushort * values); @@ -2420,15 +3971,21 @@ typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLPIXELTRANSFERIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLPIXELZOOMPROC)(GLfloat xfactor, GLfloat yfactor); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETCLAMPPROC)(GLfloat factor, GLfloat units, GLfloat clamp); typedef void (GLAD_API_PTR *PFNGLPOLYGONSTIPPLEPROC)(const GLubyte * mask); typedef void (GLAD_API_PTR *PFNGLPOPATTRIBPROC)(void); typedef void (GLAD_API_PTR *PFNGLPOPCLIENTATTRIBPROC)(void); typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void); typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void); typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void); +typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities); typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESEXTPROC)(GLsizei n, const GLuint * textures, const GLclampf * priorities); typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length); @@ -2501,11 +4058,13 @@ typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLPROGRAMVERTEXLIMITNVPROC)(GLenum target, GLint limit); +typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); typedef void (GLAD_API_PTR *PFNGLPUSHMATRIXPROC)(void); typedef void (GLAD_API_PTR *PFNGLPUSHNAMEPROC)(GLuint name); +typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DPROC)(GLdouble x, GLdouble y); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLRASTERPOS2FPROC)(GLfloat x, GLfloat y); @@ -2532,6 +4091,7 @@ typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SPROC)(GLshort x, GLshort y, GLshort typedef void (GLAD_API_PTR *PFNGLRASTERPOS4SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLREADNPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void * data); typedef void (GLAD_API_PTR *PFNGLRECTDPROC)(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); typedef void (GLAD_API_PTR *PFNGLRECTDVPROC)(const GLdouble * v1, const GLdouble * v2); typedef void (GLAD_API_PTR *PFNGLRECTFPROC)(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); @@ -2540,6 +4100,7 @@ typedef void (GLAD_API_PTR *PFNGLRECTIPROC)(GLint x1, GLint y1, GLint x2, GLint typedef void (GLAD_API_PTR *PFNGLRECTIVPROC)(const GLint * v1, const GLint * v2); typedef void (GLAD_API_PTR *PFNGLRECTSPROC)(GLshort x1, GLshort y1, GLshort x2, GLshort y2); typedef void (GLAD_API_PTR *PFNGLRECTSVPROC)(const GLshort * v1, const GLshort * v2); +typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void); typedef GLint (GLAD_API_PTR *PFNGLRENDERMODEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); @@ -2548,19 +4109,58 @@ typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum t typedef void (GLAD_API_PTR *PFNGLREQUESTRESIDENTPROGRAMSNVPROC)(GLsizei n, const GLuint * programs); typedef void (GLAD_API_PTR *PFNGLRESETHISTOGRAMPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLRESETMINMAXPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLROTATEDPROC)(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLROTATEFPROC)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); typedef void (GLAD_API_PTR *PFNGLSCALEDPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLSCALEFPROC)(GLfloat x, GLfloat y, GLfloat z); typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BPROC)(GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3BVPROC)(const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DPROC)(GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IPROC)(GLint red, GLint green, GLint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SPROC)(GLshort red, GLshort green, GLshort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UBVPROC)(const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIPROC)(GLuint red, GLuint green, GLuint blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3UIVPROC)(const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USPROC)(GLushort red, GLushort green, GLushort blue); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLOR3USVPROC)(const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint * color); +typedef void (GLAD_API_PTR *PFNGLSECONDARYCOLORPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLSELECTBUFFERPROC)(GLsizei size, GLuint * buffer); typedef void (GLAD_API_PTR *PFNGLSEPARABLEFILTER2DPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * row, const void * column); typedef void (GLAD_API_PTR *PFNGLSHADEMODELPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryFormat, const void * binary, GLsizei length); typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (GLAD_API_PTR *PFNGLSPECIALIZESHADERPROC)(GLuint shader, const GLchar * pEntryPoint, GLuint numSpecializationConstants, const GLuint * pConstantIndex, const GLuint * pConstantValue); typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); +typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DPROC)(GLdouble s); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1DVPROC)(const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORD1FPROC)(GLfloat s); @@ -2593,6 +4193,14 @@ typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IPROC)(GLint s, GLint t, GLint r, GLin typedef void (GLAD_API_PTR *PFNGLTEXCOORD4IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SPROC)(GLshort s, GLshort t, GLshort r, GLshort q); typedef void (GLAD_API_PTR *PFNGLTEXCOORD4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint * coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); +typedef void (GLAD_API_PTR *PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint * coords); typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLTEXCOORDPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); typedef void (GLAD_API_PTR *PFNGLTEXENVFPROC)(GLenum target, GLenum pname, GLfloat param); @@ -2607,17 +4215,51 @@ typedef void (GLAD_API_PTR *PFNGLTEXGENIPROC)(GLenum coord, GLenum pname, GLint typedef void (GLAD_API_PTR *PFNGLTEXGENIVPROC)(GLenum coord, GLenum pname, const GLint * params); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint * params); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBARRIERPROC)(void); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERPROC)(GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXTUREBUFFERRANGEPROC)(GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIIVPROC)(GLuint texture, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIUIVPROC)(GLuint texture, GLenum pname, const GLuint * params); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFPROC)(GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERFVPROC)(GLuint texture, GLenum pname, const GLfloat * param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIPROC)(GLuint texture, GLenum pname, GLint param); +typedef void (GLAD_API_PTR *PFNGLTEXTUREPARAMETERIVPROC)(GLuint texture, GLenum pname, const GLint * param); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE1DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DPROC)(GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)(GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE1DPROC)(GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE2DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTURESUBIMAGE3DPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); typedef void (GLAD_API_PTR *PFNGLTRACKMATRIXNVPROC)(GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)(GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)(GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); typedef void (GLAD_API_PTR *PFNGLTRANSLATEDPROC)(GLdouble x, GLdouble y, GLdouble z); typedef void (GLAD_API_PTR *PFNGLTRANSLATEFPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint location, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); @@ -2626,6 +4268,10 @@ typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); @@ -2634,6 +4280,10 @@ typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint typedef void (GLAD_API_PTR *PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1); typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); @@ -2642,6 +4292,10 @@ typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint typedef void (GLAD_API_PTR *PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); @@ -2650,14 +4304,34 @@ typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint typedef void (GLAD_API_PTR *PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint * indices); typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERARBPROC)(GLenum target); +typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPNAMEDBUFFERPROC)(GLuint buffer); typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj); typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); @@ -2688,6 +4362,14 @@ typedef void (GLAD_API_PTR *PFNGLVERTEX4IPROC)(GLint x, GLint y, GLint z, GLint typedef void (GLAD_API_PTR *PFNGLVERTEX4IVPROC)(const GLint * v); typedef void (GLAD_API_PTR *PFNGLVERTEX4SPROC)(GLshort x, GLshort y, GLshort z, GLshort w); typedef void (GLAD_API_PTR *PFNGLVERTEX4SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBBINDINGPROC)(GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBIFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYATTRIBLFORMATPROC)(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYBINDINGDIVISORPROC)(GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYELEMENTBUFFERPROC)(GLuint vaobj, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERPROC)(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLVERTEXARRAYVERTEXBUFFERSPROC)(GLuint vaobj, GLuint first, GLsizei count, const GLuint * buffers, const GLintptr * offsets, const GLsizei * strides); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DNVPROC)(GLuint index, GLdouble x); @@ -2786,6 +4468,49 @@ typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuin typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERNVPROC)(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void * pointer); @@ -2802,9 +4527,36 @@ typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4DVNVPROC)(GLuint index, GLsizei c typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4FVNVPROC)(GLuint index, GLsizei count, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4SVNVPROC)(GLuint index, GLsizei count, const GLshort * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBS4UBVNVPROC)(GLuint index, GLsizei count, const GLubyte * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); +typedef void (GLAD_API_PTR *PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTERPROC)(GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLVERTEXPOINTEREXTPROC)(GLint size, GLenum type, GLsizei stride, GLsizei count, const void * pointer); typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DPROC)(GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FPROC)(GLfloat x, GLfloat y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IPROC)(GLint x, GLint y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SPROC)(GLshort x, GLshort y); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS2SVPROC)(const GLshort * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DPROC)(GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3DVPROC)(const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FPROC)(GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3FVPROC)(const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IPROC)(GLint x, GLint y, GLint z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3IVPROC)(const GLint * v); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SPROC)(GLshort x, GLshort y, GLshort z); +typedef void (GLAD_API_PTR *PFNGLWINDOWPOS3SVPROC)(const GLshort * v); typedef void (GLAD_API_PTR *PFNGLALPHAFUNCXPROC)(GLenum func, GLfixed ref); typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFEROESPROC)(GLenum target, GLuint framebuffer); typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFEROESPROC)(GLenum target, GLuint renderbuffer); @@ -2813,32 +4565,23 @@ typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEOESPROC)(GLenum modeRGB, G typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEOESPROC)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSOESPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLCLEARCOLORXPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); -typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFOESPROC)(GLclampf depth); typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHXPROC)(GLfixed depth); typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFPROC)(GLenum p, const GLfloat * eqn); -typedef void (GLAD_API_PTR *PFNGLCLIPPLANEFOESPROC)(GLenum plane, const GLfloat * equation); typedef void (GLAD_API_PTR *PFNGLCLIPPLANEXPROC)(GLenum plane, const GLfixed * equation); typedef void (GLAD_API_PTR *PFNGLCOLOR4XPROC)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void * data); -typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSOESPROC)(GLsizei n, const GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSOESPROC)(GLsizei n, const GLuint * renderbuffers); -typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); -typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFOESPROC)(GLclampf n, GLclampf f); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEXPROC)(GLfixed n, GLfixed f); typedef void (GLAD_API_PTR *PFNGLFOGXPROC)(GLenum pname, GLfixed param); typedef void (GLAD_API_PTR *PFNGLFOGXVPROC)(GLenum pname, const GLfixed * param); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFEROESPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DOESPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLFRUSTUMFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (GLAD_API_PTR *PFNGLFRUSTUMFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (GLAD_API_PTR *PFNGLFRUSTUMXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSOESPROC)(GLsizei n, GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSOESPROC)(GLsizei n, GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPOESPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFPROC)(GLenum plane, GLfloat * equation); -typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEFOESPROC)(GLenum plane, GLfloat * equation); typedef void (GLAD_API_PTR *PFNGLGETCLIPPLANEXPROC)(GLenum plane, GLfixed * equation); typedef void (GLAD_API_PTR *PFNGLGETFIXEDVPROC)(GLenum pname, GLfixed * params); typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); @@ -2861,17 +4604,13 @@ typedef void (GLAD_API_PTR *PFNGLMULTMATRIXXPROC)(const GLfixed * m); typedef void (GLAD_API_PTR *PFNGLMULTITEXCOORD4XPROC)(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); typedef void (GLAD_API_PTR *PFNGLNORMAL3XPROC)(GLfixed nx, GLfixed ny, GLfixed nz); typedef void (GLAD_API_PTR *PFNGLORTHOFPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); -typedef void (GLAD_API_PTR *PFNGLORTHOFOESPROC)(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); typedef void (GLAD_API_PTR *PFNGLORTHOXPROC)(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); -typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); -typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXPROC)(GLenum pname, GLfixed param); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERXVPROC)(GLenum pname, const GLfixed * params); typedef void (GLAD_API_PTR *PFNGLPOINTSIZEXPROC)(GLfixed size); typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETXPROC)(GLfixed factor, GLfixed units); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEOESPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLROTATEXPROC)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z); -typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEXPROC)(GLclampx value, GLboolean invert); typedef void (GLAD_API_PTR *PFNGLSCALEXPROC)(GLfixed x, GLfixed y, GLfixed z); typedef void (GLAD_API_PTR *PFNGLTEXENVXPROC)(GLenum target, GLenum pname, GLfixed param); @@ -2906,6 +4645,14 @@ GLAD_API_CALL PFNGLATTACHSHADERPROC sf_glad_glAttachShader; #define glAttachShader sf_glad_glAttachShader GLAD_API_CALL PFNGLBEGINPROC sf_glad_glBegin; #define glBegin sf_glad_glBegin +GLAD_API_CALL PFNGLBEGINCONDITIONALRENDERPROC sf_glad_glBeginConditionalRender; +#define glBeginConditionalRender sf_glad_glBeginConditionalRender +GLAD_API_CALL PFNGLBEGINQUERYPROC sf_glad_glBeginQuery; +#define glBeginQuery sf_glad_glBeginQuery +GLAD_API_CALL PFNGLBEGINQUERYINDEXEDPROC sf_glad_glBeginQueryIndexed; +#define glBeginQueryIndexed sf_glad_glBeginQueryIndexed +GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC sf_glad_glBeginTransformFeedback; +#define glBeginTransformFeedback sf_glad_glBeginTransformFeedback GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC sf_glad_glBindAttribLocation; #define glBindAttribLocation sf_glad_glBindAttribLocation GLAD_API_CALL PFNGLBINDATTRIBLOCATIONARBPROC sf_glad_glBindAttribLocationARB; @@ -2914,10 +4661,26 @@ GLAD_API_CALL PFNGLBINDBUFFERPROC sf_glad_glBindBuffer; #define glBindBuffer sf_glad_glBindBuffer GLAD_API_CALL PFNGLBINDBUFFERARBPROC sf_glad_glBindBufferARB; #define glBindBufferARB sf_glad_glBindBufferARB +GLAD_API_CALL PFNGLBINDBUFFERBASEPROC sf_glad_glBindBufferBase; +#define glBindBufferBase sf_glad_glBindBufferBase +GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC sf_glad_glBindBufferRange; +#define glBindBufferRange sf_glad_glBindBufferRange +GLAD_API_CALL PFNGLBINDBUFFERSBASEPROC sf_glad_glBindBuffersBase; +#define glBindBuffersBase sf_glad_glBindBuffersBase +GLAD_API_CALL PFNGLBINDBUFFERSRANGEPROC sf_glad_glBindBuffersRange; +#define glBindBuffersRange sf_glad_glBindBuffersRange +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONPROC sf_glad_glBindFragDataLocation; +#define glBindFragDataLocation sf_glad_glBindFragDataLocation +GLAD_API_CALL PFNGLBINDFRAGDATALOCATIONINDEXEDPROC sf_glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed sf_glad_glBindFragDataLocationIndexed GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC sf_glad_glBindFramebuffer; #define glBindFramebuffer sf_glad_glBindFramebuffer GLAD_API_CALL PFNGLBINDFRAMEBUFFEREXTPROC sf_glad_glBindFramebufferEXT; #define glBindFramebufferEXT sf_glad_glBindFramebufferEXT +GLAD_API_CALL PFNGLBINDIMAGETEXTUREPROC sf_glad_glBindImageTexture; +#define glBindImageTexture sf_glad_glBindImageTexture +GLAD_API_CALL PFNGLBINDIMAGETEXTURESPROC sf_glad_glBindImageTextures; +#define glBindImageTextures sf_glad_glBindImageTextures GLAD_API_CALL PFNGLBINDPROGRAMARBPROC sf_glad_glBindProgramARB; #define glBindProgramARB sf_glad_glBindProgramARB GLAD_API_CALL PFNGLBINDPROGRAMNVPROC sf_glad_glBindProgramNV; @@ -2928,10 +4691,26 @@ GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC sf_glad_glBindRenderbuffer; #define glBindRenderbuffer sf_glad_glBindRenderbuffer GLAD_API_CALL PFNGLBINDRENDERBUFFEREXTPROC sf_glad_glBindRenderbufferEXT; #define glBindRenderbufferEXT sf_glad_glBindRenderbufferEXT +GLAD_API_CALL PFNGLBINDSAMPLERPROC sf_glad_glBindSampler; +#define glBindSampler sf_glad_glBindSampler +GLAD_API_CALL PFNGLBINDSAMPLERSPROC sf_glad_glBindSamplers; +#define glBindSamplers sf_glad_glBindSamplers GLAD_API_CALL PFNGLBINDTEXTUREPROC sf_glad_glBindTexture; #define glBindTexture sf_glad_glBindTexture GLAD_API_CALL PFNGLBINDTEXTUREEXTPROC sf_glad_glBindTextureEXT; #define glBindTextureEXT sf_glad_glBindTextureEXT +GLAD_API_CALL PFNGLBINDTEXTUREUNITPROC sf_glad_glBindTextureUnit; +#define glBindTextureUnit sf_glad_glBindTextureUnit +GLAD_API_CALL PFNGLBINDTEXTURESPROC sf_glad_glBindTextures; +#define glBindTextures sf_glad_glBindTextures +GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC sf_glad_glBindTransformFeedback; +#define glBindTransformFeedback sf_glad_glBindTransformFeedback +GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC sf_glad_glBindVertexArray; +#define glBindVertexArray sf_glad_glBindVertexArray +GLAD_API_CALL PFNGLBINDVERTEXBUFFERPROC sf_glad_glBindVertexBuffer; +#define glBindVertexBuffer sf_glad_glBindVertexBuffer +GLAD_API_CALL PFNGLBINDVERTEXBUFFERSPROC sf_glad_glBindVertexBuffers; +#define glBindVertexBuffers sf_glad_glBindVertexBuffers GLAD_API_CALL PFNGLBITMAPPROC sf_glad_glBitmap; #define glBitmap sf_glad_glBitmap GLAD_API_CALL PFNGLBLENDCOLORPROC sf_glad_glBlendColor; @@ -2944,6 +4723,10 @@ GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC sf_glad_glBlendEquationSeparate; #define glBlendEquationSeparate sf_glad_glBlendEquationSeparate GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEEXTPROC sf_glad_glBlendEquationSeparateEXT; #define glBlendEquationSeparateEXT sf_glad_glBlendEquationSeparateEXT +GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEIPROC sf_glad_glBlendEquationSeparatei; +#define glBlendEquationSeparatei sf_glad_glBlendEquationSeparatei +GLAD_API_CALL PFNGLBLENDEQUATIONIPROC sf_glad_glBlendEquationi; +#define glBlendEquationi sf_glad_glBlendEquationi GLAD_API_CALL PFNGLBLENDFUNCPROC sf_glad_glBlendFunc; #define glBlendFunc sf_glad_glBlendFunc GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC sf_glad_glBlendFuncSeparate; @@ -2952,14 +4735,22 @@ GLAD_API_CALL PFNGLBLENDFUNCSEPARATEEXTPROC sf_glad_glBlendFuncSeparateEXT; #define glBlendFuncSeparateEXT sf_glad_glBlendFuncSeparateEXT GLAD_API_CALL PFNGLBLENDFUNCSEPARATEINGRPROC sf_glad_glBlendFuncSeparateINGR; #define glBlendFuncSeparateINGR sf_glad_glBlendFuncSeparateINGR +GLAD_API_CALL PFNGLBLENDFUNCSEPARATEIPROC sf_glad_glBlendFuncSeparatei; +#define glBlendFuncSeparatei sf_glad_glBlendFuncSeparatei +GLAD_API_CALL PFNGLBLENDFUNCIPROC sf_glad_glBlendFunci; +#define glBlendFunci sf_glad_glBlendFunci GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC sf_glad_glBlitFramebuffer; #define glBlitFramebuffer sf_glad_glBlitFramebuffer GLAD_API_CALL PFNGLBLITFRAMEBUFFEREXTPROC sf_glad_glBlitFramebufferEXT; #define glBlitFramebufferEXT sf_glad_glBlitFramebufferEXT +GLAD_API_CALL PFNGLBLITNAMEDFRAMEBUFFERPROC sf_glad_glBlitNamedFramebuffer; +#define glBlitNamedFramebuffer sf_glad_glBlitNamedFramebuffer GLAD_API_CALL PFNGLBUFFERDATAPROC sf_glad_glBufferData; #define glBufferData sf_glad_glBufferData GLAD_API_CALL PFNGLBUFFERDATAARBPROC sf_glad_glBufferDataARB; #define glBufferDataARB sf_glad_glBufferDataARB +GLAD_API_CALL PFNGLBUFFERSTORAGEPROC sf_glad_glBufferStorage; +#define glBufferStorage sf_glad_glBufferStorage GLAD_API_CALL PFNGLBUFFERSUBDATAPROC sf_glad_glBufferSubData; #define glBufferSubData sf_glad_glBufferSubData GLAD_API_CALL PFNGLBUFFERSUBDATAARBPROC sf_glad_glBufferSubDataARB; @@ -2972,24 +4763,66 @@ GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC sf_glad_glCheckFramebufferStatus; #define glCheckFramebufferStatus sf_glad_glCheckFramebufferStatus GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC sf_glad_glCheckFramebufferStatusEXT; #define glCheckFramebufferStatusEXT sf_glad_glCheckFramebufferStatusEXT +GLAD_API_CALL PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC sf_glad_glCheckNamedFramebufferStatus; +#define glCheckNamedFramebufferStatus sf_glad_glCheckNamedFramebufferStatus +GLAD_API_CALL PFNGLCLAMPCOLORPROC sf_glad_glClampColor; +#define glClampColor sf_glad_glClampColor GLAD_API_CALL PFNGLCLEARPROC sf_glad_glClear; #define glClear sf_glad_glClear GLAD_API_CALL PFNGLCLEARACCUMPROC sf_glad_glClearAccum; #define glClearAccum sf_glad_glClearAccum +GLAD_API_CALL PFNGLCLEARBUFFERDATAPROC sf_glad_glClearBufferData; +#define glClearBufferData sf_glad_glClearBufferData +GLAD_API_CALL PFNGLCLEARBUFFERSUBDATAPROC sf_glad_glClearBufferSubData; +#define glClearBufferSubData sf_glad_glClearBufferSubData +GLAD_API_CALL PFNGLCLEARBUFFERFIPROC sf_glad_glClearBufferfi; +#define glClearBufferfi sf_glad_glClearBufferfi +GLAD_API_CALL PFNGLCLEARBUFFERFVPROC sf_glad_glClearBufferfv; +#define glClearBufferfv sf_glad_glClearBufferfv +GLAD_API_CALL PFNGLCLEARBUFFERIVPROC sf_glad_glClearBufferiv; +#define glClearBufferiv sf_glad_glClearBufferiv +GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC sf_glad_glClearBufferuiv; +#define glClearBufferuiv sf_glad_glClearBufferuiv GLAD_API_CALL PFNGLCLEARCOLORPROC sf_glad_glClearColor; #define glClearColor sf_glad_glClearColor GLAD_API_CALL PFNGLCLEARDEPTHPROC sf_glad_glClearDepth; #define glClearDepth sf_glad_glClearDepth +GLAD_API_CALL PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf; +#define glClearDepthf sf_glad_glClearDepthf +GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES; +#define glClearDepthfOES sf_glad_glClearDepthfOES GLAD_API_CALL PFNGLCLEARINDEXPROC sf_glad_glClearIndex; #define glClearIndex sf_glad_glClearIndex +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERDATAPROC sf_glad_glClearNamedBufferData; +#define glClearNamedBufferData sf_glad_glClearNamedBufferData +GLAD_API_CALL PFNGLCLEARNAMEDBUFFERSUBDATAPROC sf_glad_glClearNamedBufferSubData; +#define glClearNamedBufferSubData sf_glad_glClearNamedBufferSubData +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFIPROC sf_glad_glClearNamedFramebufferfi; +#define glClearNamedFramebufferfi sf_glad_glClearNamedFramebufferfi +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERFVPROC sf_glad_glClearNamedFramebufferfv; +#define glClearNamedFramebufferfv sf_glad_glClearNamedFramebufferfv +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERIVPROC sf_glad_glClearNamedFramebufferiv; +#define glClearNamedFramebufferiv sf_glad_glClearNamedFramebufferiv +GLAD_API_CALL PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC sf_glad_glClearNamedFramebufferuiv; +#define glClearNamedFramebufferuiv sf_glad_glClearNamedFramebufferuiv GLAD_API_CALL PFNGLCLEARSTENCILPROC sf_glad_glClearStencil; #define glClearStencil sf_glad_glClearStencil +GLAD_API_CALL PFNGLCLEARTEXIMAGEPROC sf_glad_glClearTexImage; +#define glClearTexImage sf_glad_glClearTexImage +GLAD_API_CALL PFNGLCLEARTEXSUBIMAGEPROC sf_glad_glClearTexSubImage; +#define glClearTexSubImage sf_glad_glClearTexSubImage GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREPROC sf_glad_glClientActiveTexture; #define glClientActiveTexture sf_glad_glClientActiveTexture GLAD_API_CALL PFNGLCLIENTACTIVETEXTUREARBPROC sf_glad_glClientActiveTextureARB; #define glClientActiveTextureARB sf_glad_glClientActiveTextureARB +GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC sf_glad_glClientWaitSync; +#define glClientWaitSync sf_glad_glClientWaitSync +GLAD_API_CALL PFNGLCLIPCONTROLPROC sf_glad_glClipControl; +#define glClipControl sf_glad_glClipControl GLAD_API_CALL PFNGLCLIPPLANEPROC sf_glad_glClipPlane; #define glClipPlane sf_glad_glClipPlane +GLAD_API_CALL PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES; +#define glClipPlanefOES sf_glad_glClipPlanefOES GLAD_API_CALL PFNGLCOLOR3BPROC sf_glad_glColor3b; #define glColor3b sf_glad_glColor3b GLAD_API_CALL PFNGLCOLOR3BVPROC sf_glad_glColor3bv; @@ -3056,8 +4889,18 @@ GLAD_API_CALL PFNGLCOLOR4USVPROC sf_glad_glColor4usv; #define glColor4usv sf_glad_glColor4usv GLAD_API_CALL PFNGLCOLORMASKPROC sf_glad_glColorMask; #define glColorMask sf_glad_glColorMask +GLAD_API_CALL PFNGLCOLORMASKIPROC sf_glad_glColorMaski; +#define glColorMaski sf_glad_glColorMaski GLAD_API_CALL PFNGLCOLORMATERIALPROC sf_glad_glColorMaterial; #define glColorMaterial sf_glad_glColorMaterial +GLAD_API_CALL PFNGLCOLORP3UIPROC sf_glad_glColorP3ui; +#define glColorP3ui sf_glad_glColorP3ui +GLAD_API_CALL PFNGLCOLORP3UIVPROC sf_glad_glColorP3uiv; +#define glColorP3uiv sf_glad_glColorP3uiv +GLAD_API_CALL PFNGLCOLORP4UIPROC sf_glad_glColorP4ui; +#define glColorP4ui sf_glad_glColorP4ui +GLAD_API_CALL PFNGLCOLORP4UIVPROC sf_glad_glColorP4uiv; +#define glColorP4uiv sf_glad_glColorP4uiv GLAD_API_CALL PFNGLCOLORPOINTERPROC sf_glad_glColorPointer; #define glColorPointer sf_glad_glColorPointer GLAD_API_CALL PFNGLCOLORPOINTEREXTPROC sf_glad_glColorPointerEXT; @@ -3074,6 +4917,24 @@ GLAD_API_CALL PFNGLCOMPILESHADERPROC sf_glad_glCompileShader; #define glCompileShader sf_glad_glCompileShader GLAD_API_CALL PFNGLCOMPILESHADERARBPROC sf_glad_glCompileShaderARB; #define glCompileShaderARB sf_glad_glCompileShaderARB +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE1DPROC sf_glad_glCompressedTexImage1D; +#define glCompressedTexImage1D sf_glad_glCompressedTexImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D; +#define glCompressedTexImage2D sf_glad_glCompressedTexImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC sf_glad_glCompressedTexImage3D; +#define glCompressedTexImage3D sf_glad_glCompressedTexImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC sf_glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D sf_glad_glCompressedTexSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D sf_glad_glCompressedTexSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC sf_glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D sf_glad_glCompressedTexSubImage3D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC sf_glad_glCompressedTextureSubImage1D; +#define glCompressedTextureSubImage1D sf_glad_glCompressedTextureSubImage1D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC sf_glad_glCompressedTextureSubImage2D; +#define glCompressedTextureSubImage2D sf_glad_glCompressedTextureSubImage2D +GLAD_API_CALL PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC sf_glad_glCompressedTextureSubImage3D; +#define glCompressedTextureSubImage3D sf_glad_glCompressedTextureSubImage3D GLAD_API_CALL PFNGLCONVOLUTIONFILTER1DPROC sf_glad_glConvolutionFilter1D; #define glConvolutionFilter1D sf_glad_glConvolutionFilter1D GLAD_API_CALL PFNGLCONVOLUTIONFILTER2DPROC sf_glad_glConvolutionFilter2D; @@ -3096,6 +4957,10 @@ GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER1DPROC sf_glad_glCopyConvolutionFilter1D #define glCopyConvolutionFilter1D sf_glad_glCopyConvolutionFilter1D GLAD_API_CALL PFNGLCOPYCONVOLUTIONFILTER2DPROC sf_glad_glCopyConvolutionFilter2D; #define glCopyConvolutionFilter2D sf_glad_glCopyConvolutionFilter2D +GLAD_API_CALL PFNGLCOPYIMAGESUBDATAPROC sf_glad_glCopyImageSubData; +#define glCopyImageSubData sf_glad_glCopyImageSubData +GLAD_API_CALL PFNGLCOPYNAMEDBUFFERSUBDATAPROC sf_glad_glCopyNamedBufferSubData; +#define glCopyNamedBufferSubData sf_glad_glCopyNamedBufferSubData GLAD_API_CALL PFNGLCOPYPIXELSPROC sf_glad_glCopyPixels; #define glCopyPixels sf_glad_glCopyPixels GLAD_API_CALL PFNGLCOPYTEXIMAGE1DPROC sf_glad_glCopyTexImage1D; @@ -3118,16 +4983,40 @@ GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC sf_glad_glCopyTexSubImage3D; #define glCopyTexSubImage3D sf_glad_glCopyTexSubImage3D GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DEXTPROC sf_glad_glCopyTexSubImage3DEXT; #define glCopyTexSubImage3DEXT sf_glad_glCopyTexSubImage3DEXT +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE1DPROC sf_glad_glCopyTextureSubImage1D; +#define glCopyTextureSubImage1D sf_glad_glCopyTextureSubImage1D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE2DPROC sf_glad_glCopyTextureSubImage2D; +#define glCopyTextureSubImage2D sf_glad_glCopyTextureSubImage2D +GLAD_API_CALL PFNGLCOPYTEXTURESUBIMAGE3DPROC sf_glad_glCopyTextureSubImage3D; +#define glCopyTextureSubImage3D sf_glad_glCopyTextureSubImage3D +GLAD_API_CALL PFNGLCREATEBUFFERSPROC sf_glad_glCreateBuffers; +#define glCreateBuffers sf_glad_glCreateBuffers +GLAD_API_CALL PFNGLCREATEFRAMEBUFFERSPROC sf_glad_glCreateFramebuffers; +#define glCreateFramebuffers sf_glad_glCreateFramebuffers GLAD_API_CALL PFNGLCREATEPROGRAMPROC sf_glad_glCreateProgram; #define glCreateProgram sf_glad_glCreateProgram GLAD_API_CALL PFNGLCREATEPROGRAMOBJECTARBPROC sf_glad_glCreateProgramObjectARB; #define glCreateProgramObjectARB sf_glad_glCreateProgramObjectARB +GLAD_API_CALL PFNGLCREATEPROGRAMPIPELINESPROC sf_glad_glCreateProgramPipelines; +#define glCreateProgramPipelines sf_glad_glCreateProgramPipelines +GLAD_API_CALL PFNGLCREATEQUERIESPROC sf_glad_glCreateQueries; +#define glCreateQueries sf_glad_glCreateQueries +GLAD_API_CALL PFNGLCREATERENDERBUFFERSPROC sf_glad_glCreateRenderbuffers; +#define glCreateRenderbuffers sf_glad_glCreateRenderbuffers +GLAD_API_CALL PFNGLCREATESAMPLERSPROC sf_glad_glCreateSamplers; +#define glCreateSamplers sf_glad_glCreateSamplers GLAD_API_CALL PFNGLCREATESHADERPROC sf_glad_glCreateShader; #define glCreateShader sf_glad_glCreateShader GLAD_API_CALL PFNGLCREATESHADEROBJECTARBPROC sf_glad_glCreateShaderObjectARB; #define glCreateShaderObjectARB sf_glad_glCreateShaderObjectARB GLAD_API_CALL PFNGLCREATESHADERPROGRAMVPROC sf_glad_glCreateShaderProgramv; #define glCreateShaderProgramv sf_glad_glCreateShaderProgramv +GLAD_API_CALL PFNGLCREATETEXTURESPROC sf_glad_glCreateTextures; +#define glCreateTextures sf_glad_glCreateTextures +GLAD_API_CALL PFNGLCREATETRANSFORMFEEDBACKSPROC sf_glad_glCreateTransformFeedbacks; +#define glCreateTransformFeedbacks sf_glad_glCreateTransformFeedbacks +GLAD_API_CALL PFNGLCREATEVERTEXARRAYSPROC sf_glad_glCreateVertexArrays; +#define glCreateVertexArrays sf_glad_glCreateVertexArrays GLAD_API_CALL PFNGLCULLFACEPROC sf_glad_glCullFace; #define glCullFace sf_glad_glCullFace GLAD_API_CALL PFNGLDEBUGMESSAGECALLBACKPROC sf_glad_glDebugMessageCallback; @@ -3148,26 +5037,52 @@ GLAD_API_CALL PFNGLDELETELISTSPROC sf_glad_glDeleteLists; #define glDeleteLists sf_glad_glDeleteLists GLAD_API_CALL PFNGLDELETEOBJECTARBPROC sf_glad_glDeleteObjectARB; #define glDeleteObjectARB sf_glad_glDeleteObjectARB +GLAD_API_CALL PFNGLDELETEPROGRAMPROC sf_glad_glDeleteProgram; +#define glDeleteProgram sf_glad_glDeleteProgram GLAD_API_CALL PFNGLDELETEPROGRAMPIPELINESPROC sf_glad_glDeleteProgramPipelines; #define glDeleteProgramPipelines sf_glad_glDeleteProgramPipelines GLAD_API_CALL PFNGLDELETEPROGRAMSARBPROC sf_glad_glDeleteProgramsARB; #define glDeleteProgramsARB sf_glad_glDeleteProgramsARB GLAD_API_CALL PFNGLDELETEPROGRAMSNVPROC sf_glad_glDeleteProgramsNV; #define glDeleteProgramsNV sf_glad_glDeleteProgramsNV +GLAD_API_CALL PFNGLDELETEQUERIESPROC sf_glad_glDeleteQueries; +#define glDeleteQueries sf_glad_glDeleteQueries GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC sf_glad_glDeleteRenderbuffers; #define glDeleteRenderbuffers sf_glad_glDeleteRenderbuffers GLAD_API_CALL PFNGLDELETERENDERBUFFERSEXTPROC sf_glad_glDeleteRenderbuffersEXT; #define glDeleteRenderbuffersEXT sf_glad_glDeleteRenderbuffersEXT +GLAD_API_CALL PFNGLDELETESAMPLERSPROC sf_glad_glDeleteSamplers; +#define glDeleteSamplers sf_glad_glDeleteSamplers +GLAD_API_CALL PFNGLDELETESHADERPROC sf_glad_glDeleteShader; +#define glDeleteShader sf_glad_glDeleteShader +GLAD_API_CALL PFNGLDELETESYNCPROC sf_glad_glDeleteSync; +#define glDeleteSync sf_glad_glDeleteSync GLAD_API_CALL PFNGLDELETETEXTURESPROC sf_glad_glDeleteTextures; #define glDeleteTextures sf_glad_glDeleteTextures GLAD_API_CALL PFNGLDELETETEXTURESEXTPROC sf_glad_glDeleteTexturesEXT; #define glDeleteTexturesEXT sf_glad_glDeleteTexturesEXT +GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC sf_glad_glDeleteTransformFeedbacks; +#define glDeleteTransformFeedbacks sf_glad_glDeleteTransformFeedbacks +GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC sf_glad_glDeleteVertexArrays; +#define glDeleteVertexArrays sf_glad_glDeleteVertexArrays GLAD_API_CALL PFNGLDEPTHFUNCPROC sf_glad_glDepthFunc; #define glDepthFunc sf_glad_glDepthFunc GLAD_API_CALL PFNGLDEPTHMASKPROC sf_glad_glDepthMask; #define glDepthMask sf_glad_glDepthMask GLAD_API_CALL PFNGLDEPTHRANGEPROC sf_glad_glDepthRange; #define glDepthRange sf_glad_glDepthRange +GLAD_API_CALL PFNGLDEPTHRANGEARRAYDVNVPROC sf_glad_glDepthRangeArraydvNV; +#define glDepthRangeArraydvNV sf_glad_glDepthRangeArraydvNV +GLAD_API_CALL PFNGLDEPTHRANGEARRAYVPROC sf_glad_glDepthRangeArrayv; +#define glDepthRangeArrayv sf_glad_glDepthRangeArrayv +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDPROC sf_glad_glDepthRangeIndexed; +#define glDepthRangeIndexed sf_glad_glDepthRangeIndexed +GLAD_API_CALL PFNGLDEPTHRANGEINDEXEDDNVPROC sf_glad_glDepthRangeIndexeddNV; +#define glDepthRangeIndexeddNV sf_glad_glDepthRangeIndexeddNV +GLAD_API_CALL PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef; +#define glDepthRangef sf_glad_glDepthRangef +GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES; +#define glDepthRangefOES sf_glad_glDepthRangefOES GLAD_API_CALL PFNGLDETACHOBJECTARBPROC sf_glad_glDetachObjectARB; #define glDetachObjectARB sf_glad_glDetachObjectARB GLAD_API_CALL PFNGLDETACHSHADERPROC sf_glad_glDetachShader; @@ -3176,20 +5091,60 @@ GLAD_API_CALL PFNGLDISABLEPROC sf_glad_glDisable; #define glDisable sf_glad_glDisable GLAD_API_CALL PFNGLDISABLECLIENTSTATEPROC sf_glad_glDisableClientState; #define glDisableClientState sf_glad_glDisableClientState +GLAD_API_CALL PFNGLDISABLEVERTEXARRAYATTRIBPROC sf_glad_glDisableVertexArrayAttrib; +#define glDisableVertexArrayAttrib sf_glad_glDisableVertexArrayAttrib GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC sf_glad_glDisableVertexAttribArray; #define glDisableVertexAttribArray sf_glad_glDisableVertexAttribArray GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYARBPROC sf_glad_glDisableVertexAttribArrayARB; #define glDisableVertexAttribArrayARB sf_glad_glDisableVertexAttribArrayARB +GLAD_API_CALL PFNGLDISABLEIPROC sf_glad_glDisablei; +#define glDisablei sf_glad_glDisablei +GLAD_API_CALL PFNGLDISPATCHCOMPUTEPROC sf_glad_glDispatchCompute; +#define glDispatchCompute sf_glad_glDispatchCompute +GLAD_API_CALL PFNGLDISPATCHCOMPUTEINDIRECTPROC sf_glad_glDispatchComputeIndirect; +#define glDispatchComputeIndirect sf_glad_glDispatchComputeIndirect GLAD_API_CALL PFNGLDRAWARRAYSPROC sf_glad_glDrawArrays; #define glDrawArrays sf_glad_glDrawArrays GLAD_API_CALL PFNGLDRAWARRAYSEXTPROC sf_glad_glDrawArraysEXT; #define glDrawArraysEXT sf_glad_glDrawArraysEXT +GLAD_API_CALL PFNGLDRAWARRAYSINDIRECTPROC sf_glad_glDrawArraysIndirect; +#define glDrawArraysIndirect sf_glad_glDrawArraysIndirect +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC sf_glad_glDrawArraysInstanced; +#define glDrawArraysInstanced sf_glad_glDrawArraysInstanced +GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawArraysInstancedBaseInstance; +#define glDrawArraysInstancedBaseInstance sf_glad_glDrawArraysInstancedBaseInstance GLAD_API_CALL PFNGLDRAWBUFFERPROC sf_glad_glDrawBuffer; #define glDrawBuffer sf_glad_glDrawBuffer +GLAD_API_CALL PFNGLDRAWBUFFERSPROC sf_glad_glDrawBuffers; +#define glDrawBuffers sf_glad_glDrawBuffers GLAD_API_CALL PFNGLDRAWELEMENTSPROC sf_glad_glDrawElements; #define glDrawElements sf_glad_glDrawElements +GLAD_API_CALL PFNGLDRAWELEMENTSBASEVERTEXPROC sf_glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex sf_glad_glDrawElementsBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINDIRECTPROC sf_glad_glDrawElementsIndirect; +#define glDrawElementsIndirect sf_glad_glDrawElementsIndirect +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC sf_glad_glDrawElementsInstanced; +#define glDrawElementsInstanced sf_glad_glDrawElementsInstanced +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseInstance; +#define glDrawElementsInstancedBaseInstance sf_glad_glDrawElementsInstancedBaseInstance +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC sf_glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex sf_glad_glDrawElementsInstancedBaseVertex +GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseVertexBaseInstance; +#define glDrawElementsInstancedBaseVertexBaseInstance sf_glad_glDrawElementsInstancedBaseVertexBaseInstance GLAD_API_CALL PFNGLDRAWPIXELSPROC sf_glad_glDrawPixels; #define glDrawPixels sf_glad_glDrawPixels +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC sf_glad_glDrawRangeElements; +#define glDrawRangeElements sf_glad_glDrawRangeElements +GLAD_API_CALL PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC sf_glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex sf_glad_glDrawRangeElementsBaseVertex +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKPROC sf_glad_glDrawTransformFeedback; +#define glDrawTransformFeedback sf_glad_glDrawTransformFeedback +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC sf_glad_glDrawTransformFeedbackInstanced; +#define glDrawTransformFeedbackInstanced sf_glad_glDrawTransformFeedbackInstanced +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC sf_glad_glDrawTransformFeedbackStream; +#define glDrawTransformFeedbackStream sf_glad_glDrawTransformFeedbackStream +GLAD_API_CALL PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC sf_glad_glDrawTransformFeedbackStreamInstanced; +#define glDrawTransformFeedbackStreamInstanced sf_glad_glDrawTransformFeedbackStreamInstanced GLAD_API_CALL PFNGLEDGEFLAGPROC sf_glad_glEdgeFlag; #define glEdgeFlag sf_glad_glEdgeFlag GLAD_API_CALL PFNGLEDGEFLAGPOINTERPROC sf_glad_glEdgeFlagPointer; @@ -3202,14 +5157,26 @@ GLAD_API_CALL PFNGLENABLEPROC sf_glad_glEnable; #define glEnable sf_glad_glEnable GLAD_API_CALL PFNGLENABLECLIENTSTATEPROC sf_glad_glEnableClientState; #define glEnableClientState sf_glad_glEnableClientState +GLAD_API_CALL PFNGLENABLEVERTEXARRAYATTRIBPROC sf_glad_glEnableVertexArrayAttrib; +#define glEnableVertexArrayAttrib sf_glad_glEnableVertexArrayAttrib GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC sf_glad_glEnableVertexAttribArray; #define glEnableVertexAttribArray sf_glad_glEnableVertexAttribArray GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYARBPROC sf_glad_glEnableVertexAttribArrayARB; #define glEnableVertexAttribArrayARB sf_glad_glEnableVertexAttribArrayARB +GLAD_API_CALL PFNGLENABLEIPROC sf_glad_glEnablei; +#define glEnablei sf_glad_glEnablei GLAD_API_CALL PFNGLENDPROC sf_glad_glEnd; #define glEnd sf_glad_glEnd +GLAD_API_CALL PFNGLENDCONDITIONALRENDERPROC sf_glad_glEndConditionalRender; +#define glEndConditionalRender sf_glad_glEndConditionalRender GLAD_API_CALL PFNGLENDLISTPROC sf_glad_glEndList; #define glEndList sf_glad_glEndList +GLAD_API_CALL PFNGLENDQUERYPROC sf_glad_glEndQuery; +#define glEndQuery sf_glad_glEndQuery +GLAD_API_CALL PFNGLENDQUERYINDEXEDPROC sf_glad_glEndQueryIndexed; +#define glEndQueryIndexed sf_glad_glEndQueryIndexed +GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC sf_glad_glEndTransformFeedback; +#define glEndTransformFeedback sf_glad_glEndTransformFeedback GLAD_API_CALL PFNGLEVALCOORD1DPROC sf_glad_glEvalCoord1d; #define glEvalCoord1d sf_glad_glEvalCoord1d GLAD_API_CALL PFNGLEVALCOORD1DVPROC sf_glad_glEvalCoord1dv; @@ -3238,10 +5205,26 @@ GLAD_API_CALL PFNGLEXECUTEPROGRAMNVPROC sf_glad_glExecuteProgramNV; #define glExecuteProgramNV sf_glad_glExecuteProgramNV GLAD_API_CALL PFNGLFEEDBACKBUFFERPROC sf_glad_glFeedbackBuffer; #define glFeedbackBuffer sf_glad_glFeedbackBuffer +GLAD_API_CALL PFNGLFENCESYNCPROC sf_glad_glFenceSync; +#define glFenceSync sf_glad_glFenceSync GLAD_API_CALL PFNGLFINISHPROC sf_glad_glFinish; #define glFinish sf_glad_glFinish GLAD_API_CALL PFNGLFLUSHPROC sf_glad_glFlush; #define glFlush sf_glad_glFlush +GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC sf_glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange sf_glad_glFlushMappedBufferRange +GLAD_API_CALL PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC sf_glad_glFlushMappedNamedBufferRange; +#define glFlushMappedNamedBufferRange sf_glad_glFlushMappedNamedBufferRange +GLAD_API_CALL PFNGLFOGCOORDPOINTERPROC sf_glad_glFogCoordPointer; +#define glFogCoordPointer sf_glad_glFogCoordPointer +GLAD_API_CALL PFNGLFOGCOORDDPROC sf_glad_glFogCoordd; +#define glFogCoordd sf_glad_glFogCoordd +GLAD_API_CALL PFNGLFOGCOORDDVPROC sf_glad_glFogCoorddv; +#define glFogCoorddv sf_glad_glFogCoorddv +GLAD_API_CALL PFNGLFOGCOORDFPROC sf_glad_glFogCoordf; +#define glFogCoordf sf_glad_glFogCoordf +GLAD_API_CALL PFNGLFOGCOORDFVPROC sf_glad_glFogCoordfv; +#define glFogCoordfv sf_glad_glFogCoordfv GLAD_API_CALL PFNGLFOGFPROC sf_glad_glFogf; #define glFogf sf_glad_glFogf GLAD_API_CALL PFNGLFOGFVPROC sf_glad_glFogfv; @@ -3250,6 +5233,8 @@ GLAD_API_CALL PFNGLFOGIPROC sf_glad_glFogi; #define glFogi sf_glad_glFogi GLAD_API_CALL PFNGLFOGIVPROC sf_glad_glFogiv; #define glFogiv sf_glad_glFogiv +GLAD_API_CALL PFNGLFRAMEBUFFERPARAMETERIPROC sf_glad_glFramebufferParameteri; +#define glFramebufferParameteri sf_glad_glFramebufferParameteri GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC sf_glad_glFramebufferRenderbuffer; #define glFramebufferRenderbuffer sf_glad_glFramebufferRenderbuffer GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC sf_glad_glFramebufferRenderbufferEXT; @@ -3286,6 +5271,8 @@ GLAD_API_CALL PFNGLFRONTFACEPROC sf_glad_glFrontFace; #define glFrontFace sf_glad_glFrontFace GLAD_API_CALL PFNGLFRUSTUMPROC sf_glad_glFrustum; #define glFrustum sf_glad_glFrustum +GLAD_API_CALL PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES; +#define glFrustumfOES sf_glad_glFrustumfOES GLAD_API_CALL PFNGLGENBUFFERSPROC sf_glad_glGenBuffers; #define glGenBuffers sf_glad_glGenBuffers GLAD_API_CALL PFNGLGENBUFFERSARBPROC sf_glad_glGenBuffersARB; @@ -3302,34 +5289,66 @@ GLAD_API_CALL PFNGLGENPROGRAMSARBPROC sf_glad_glGenProgramsARB; #define glGenProgramsARB sf_glad_glGenProgramsARB GLAD_API_CALL PFNGLGENPROGRAMSNVPROC sf_glad_glGenProgramsNV; #define glGenProgramsNV sf_glad_glGenProgramsNV +GLAD_API_CALL PFNGLGENQUERIESPROC sf_glad_glGenQueries; +#define glGenQueries sf_glad_glGenQueries GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC sf_glad_glGenRenderbuffers; #define glGenRenderbuffers sf_glad_glGenRenderbuffers GLAD_API_CALL PFNGLGENRENDERBUFFERSEXTPROC sf_glad_glGenRenderbuffersEXT; #define glGenRenderbuffersEXT sf_glad_glGenRenderbuffersEXT +GLAD_API_CALL PFNGLGENSAMPLERSPROC sf_glad_glGenSamplers; +#define glGenSamplers sf_glad_glGenSamplers GLAD_API_CALL PFNGLGENTEXTURESPROC sf_glad_glGenTextures; #define glGenTextures sf_glad_glGenTextures GLAD_API_CALL PFNGLGENTEXTURESEXTPROC sf_glad_glGenTexturesEXT; #define glGenTexturesEXT sf_glad_glGenTexturesEXT +GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC sf_glad_glGenTransformFeedbacks; +#define glGenTransformFeedbacks sf_glad_glGenTransformFeedbacks +GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC sf_glad_glGenVertexArrays; +#define glGenVertexArrays sf_glad_glGenVertexArrays GLAD_API_CALL PFNGLGENERATEMIPMAPPROC sf_glad_glGenerateMipmap; #define glGenerateMipmap sf_glad_glGenerateMipmap GLAD_API_CALL PFNGLGENERATEMIPMAPEXTPROC sf_glad_glGenerateMipmapEXT; #define glGenerateMipmapEXT sf_glad_glGenerateMipmapEXT +GLAD_API_CALL PFNGLGENERATETEXTUREMIPMAPPROC sf_glad_glGenerateTextureMipmap; +#define glGenerateTextureMipmap sf_glad_glGenerateTextureMipmap +GLAD_API_CALL PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC sf_glad_glGetActiveAtomicCounterBufferiv; +#define glGetActiveAtomicCounterBufferiv sf_glad_glGetActiveAtomicCounterBufferiv GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC sf_glad_glGetActiveAttrib; #define glGetActiveAttrib sf_glad_glGetActiveAttrib GLAD_API_CALL PFNGLGETACTIVEATTRIBARBPROC sf_glad_glGetActiveAttribARB; #define glGetActiveAttribARB sf_glad_glGetActiveAttribARB +GLAD_API_CALL PFNGLGETACTIVESUBROUTINENAMEPROC sf_glad_glGetActiveSubroutineName; +#define glGetActiveSubroutineName sf_glad_glGetActiveSubroutineName +GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC sf_glad_glGetActiveSubroutineUniformName; +#define glGetActiveSubroutineUniformName sf_glad_glGetActiveSubroutineUniformName +GLAD_API_CALL PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC sf_glad_glGetActiveSubroutineUniformiv; +#define glGetActiveSubroutineUniformiv sf_glad_glGetActiveSubroutineUniformiv GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC sf_glad_glGetActiveUniform; #define glGetActiveUniform sf_glad_glGetActiveUniform GLAD_API_CALL PFNGLGETACTIVEUNIFORMARBPROC sf_glad_glGetActiveUniformARB; #define glGetActiveUniformARB sf_glad_glGetActiveUniformARB +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC sf_glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName sf_glad_glGetActiveUniformBlockName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC sf_glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv sf_glad_glGetActiveUniformBlockiv +GLAD_API_CALL PFNGLGETACTIVEUNIFORMNAMEPROC sf_glad_glGetActiveUniformName; +#define glGetActiveUniformName sf_glad_glGetActiveUniformName +GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC sf_glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv sf_glad_glGetActiveUniformsiv GLAD_API_CALL PFNGLGETATTACHEDOBJECTSARBPROC sf_glad_glGetAttachedObjectsARB; #define glGetAttachedObjectsARB sf_glad_glGetAttachedObjectsARB +GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC sf_glad_glGetAttachedShaders; +#define glGetAttachedShaders sf_glad_glGetAttachedShaders GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC sf_glad_glGetAttribLocation; #define glGetAttribLocation sf_glad_glGetAttribLocation GLAD_API_CALL PFNGLGETATTRIBLOCATIONARBPROC sf_glad_glGetAttribLocationARB; #define glGetAttribLocationARB sf_glad_glGetAttribLocationARB +GLAD_API_CALL PFNGLGETBOOLEANI_VPROC sf_glad_glGetBooleani_v; +#define glGetBooleani_v sf_glad_glGetBooleani_v GLAD_API_CALL PFNGLGETBOOLEANVPROC sf_glad_glGetBooleanv; #define glGetBooleanv sf_glad_glGetBooleanv +GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC sf_glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v sf_glad_glGetBufferParameteri64v GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC sf_glad_glGetBufferParameteriv; #define glGetBufferParameteriv sf_glad_glGetBufferParameteriv GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVARBPROC sf_glad_glGetBufferParameterivARB; @@ -3344,12 +5363,20 @@ GLAD_API_CALL PFNGLGETBUFFERSUBDATAARBPROC sf_glad_glGetBufferSubDataARB; #define glGetBufferSubDataARB sf_glad_glGetBufferSubDataARB GLAD_API_CALL PFNGLGETCLIPPLANEPROC sf_glad_glGetClipPlane; #define glGetClipPlane sf_glad_glGetClipPlane +GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES; +#define glGetClipPlanefOES sf_glad_glGetClipPlanefOES GLAD_API_CALL PFNGLGETCOLORTABLEPROC sf_glad_glGetColorTable; #define glGetColorTable sf_glad_glGetColorTable GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERFVPROC sf_glad_glGetColorTableParameterfv; #define glGetColorTableParameterfv sf_glad_glGetColorTableParameterfv GLAD_API_CALL PFNGLGETCOLORTABLEPARAMETERIVPROC sf_glad_glGetColorTableParameteriv; #define glGetColorTableParameteriv sf_glad_glGetColorTableParameteriv +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXIMAGEPROC sf_glad_glGetCompressedTexImage; +#define glGetCompressedTexImage sf_glad_glGetCompressedTexImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC sf_glad_glGetCompressedTextureImage; +#define glGetCompressedTextureImage sf_glad_glGetCompressedTextureImage +GLAD_API_CALL PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC sf_glad_glGetCompressedTextureSubImage; +#define glGetCompressedTextureSubImage sf_glad_glGetCompressedTextureSubImage GLAD_API_CALL PFNGLGETCONVOLUTIONFILTERPROC sf_glad_glGetConvolutionFilter; #define glGetConvolutionFilter sf_glad_glGetConvolutionFilter GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERFVPROC sf_glad_glGetConvolutionParameterfv; @@ -3358,16 +5385,28 @@ GLAD_API_CALL PFNGLGETCONVOLUTIONPARAMETERIVPROC sf_glad_glGetConvolutionParamet #define glGetConvolutionParameteriv sf_glad_glGetConvolutionParameteriv GLAD_API_CALL PFNGLGETDEBUGMESSAGELOGPROC sf_glad_glGetDebugMessageLog; #define glGetDebugMessageLog sf_glad_glGetDebugMessageLog +GLAD_API_CALL PFNGLGETDOUBLEI_VPROC sf_glad_glGetDoublei_v; +#define glGetDoublei_v sf_glad_glGetDoublei_v GLAD_API_CALL PFNGLGETDOUBLEVPROC sf_glad_glGetDoublev; #define glGetDoublev sf_glad_glGetDoublev GLAD_API_CALL PFNGLGETERRORPROC sf_glad_glGetError; #define glGetError sf_glad_glGetError +GLAD_API_CALL PFNGLGETFLOATI_VPROC sf_glad_glGetFloati_v; +#define glGetFloati_v sf_glad_glGetFloati_v GLAD_API_CALL PFNGLGETFLOATVPROC sf_glad_glGetFloatv; #define glGetFloatv sf_glad_glGetFloatv +GLAD_API_CALL PFNGLGETFRAGDATAINDEXPROC sf_glad_glGetFragDataIndex; +#define glGetFragDataIndex sf_glad_glGetFragDataIndex +GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC sf_glad_glGetFragDataLocation; +#define glGetFragDataLocation sf_glad_glGetFragDataLocation GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetFramebufferAttachmentParameteriv; #define glGetFramebufferAttachmentParameteriv sf_glad_glGetFramebufferAttachmentParameteriv GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC sf_glad_glGetFramebufferAttachmentParameterivEXT; #define glGetFramebufferAttachmentParameterivEXT sf_glad_glGetFramebufferAttachmentParameterivEXT +GLAD_API_CALL PFNGLGETFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetFramebufferParameteriv; +#define glGetFramebufferParameteriv sf_glad_glGetFramebufferParameteriv +GLAD_API_CALL PFNGLGETGRAPHICSRESETSTATUSPROC sf_glad_glGetGraphicsResetStatus; +#define glGetGraphicsResetStatus sf_glad_glGetGraphicsResetStatus GLAD_API_CALL PFNGLGETHANDLEARBPROC sf_glad_glGetHandleARB; #define glGetHandleARB sf_glad_glGetHandleARB GLAD_API_CALL PFNGLGETHISTOGRAMPROC sf_glad_glGetHistogram; @@ -3378,8 +5417,18 @@ GLAD_API_CALL PFNGLGETHISTOGRAMPARAMETERIVPROC sf_glad_glGetHistogramParameteriv #define glGetHistogramParameteriv sf_glad_glGetHistogramParameteriv GLAD_API_CALL PFNGLGETINFOLOGARBPROC sf_glad_glGetInfoLogARB; #define glGetInfoLogARB sf_glad_glGetInfoLogARB +GLAD_API_CALL PFNGLGETINTEGER64I_VPROC sf_glad_glGetInteger64i_v; +#define glGetInteger64i_v sf_glad_glGetInteger64i_v +GLAD_API_CALL PFNGLGETINTEGER64VPROC sf_glad_glGetInteger64v; +#define glGetInteger64v sf_glad_glGetInteger64v +GLAD_API_CALL PFNGLGETINTEGERI_VPROC sf_glad_glGetIntegeri_v; +#define glGetIntegeri_v sf_glad_glGetIntegeri_v GLAD_API_CALL PFNGLGETINTEGERVPROC sf_glad_glGetIntegerv; #define glGetIntegerv sf_glad_glGetIntegerv +GLAD_API_CALL PFNGLGETINTERNALFORMATI64VPROC sf_glad_glGetInternalformati64v; +#define glGetInternalformati64v sf_glad_glGetInternalformati64v +GLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC sf_glad_glGetInternalformativ; +#define glGetInternalformativ sf_glad_glGetInternalformativ GLAD_API_CALL PFNGLGETLIGHTFVPROC sf_glad_glGetLightfv; #define glGetLightfv sf_glad_glGetLightfv GLAD_API_CALL PFNGLGETLIGHTIVPROC sf_glad_glGetLightiv; @@ -3400,6 +5449,22 @@ GLAD_API_CALL PFNGLGETMINMAXPARAMETERFVPROC sf_glad_glGetMinmaxParameterfv; #define glGetMinmaxParameterfv sf_glad_glGetMinmaxParameterfv GLAD_API_CALL PFNGLGETMINMAXPARAMETERIVPROC sf_glad_glGetMinmaxParameteriv; #define glGetMinmaxParameteriv sf_glad_glGetMinmaxParameteriv +GLAD_API_CALL PFNGLGETMULTISAMPLEFVPROC sf_glad_glGetMultisamplefv; +#define glGetMultisamplefv sf_glad_glGetMultisamplefv +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERI64VPROC sf_glad_glGetNamedBufferParameteri64v; +#define glGetNamedBufferParameteri64v sf_glad_glGetNamedBufferParameteri64v +GLAD_API_CALL PFNGLGETNAMEDBUFFERPARAMETERIVPROC sf_glad_glGetNamedBufferParameteriv; +#define glGetNamedBufferParameteriv sf_glad_glGetNamedBufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDBUFFERPOINTERVPROC sf_glad_glGetNamedBufferPointerv; +#define glGetNamedBufferPointerv sf_glad_glGetNamedBufferPointerv +GLAD_API_CALL PFNGLGETNAMEDBUFFERSUBDATAPROC sf_glad_glGetNamedBufferSubData; +#define glGetNamedBufferSubData sf_glad_glGetNamedBufferSubData +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetNamedFramebufferAttachmentParameteriv; +#define glGetNamedFramebufferAttachmentParameteriv sf_glad_glGetNamedFramebufferAttachmentParameteriv +GLAD_API_CALL PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetNamedFramebufferParameteriv; +#define glGetNamedFramebufferParameteriv sf_glad_glGetNamedFramebufferParameteriv +GLAD_API_CALL PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC sf_glad_glGetNamedRenderbufferParameteriv; +#define glGetNamedRenderbufferParameteriv sf_glad_glGetNamedRenderbufferParameteriv GLAD_API_CALL PFNGLGETOBJECTLABELPROC sf_glad_glGetObjectLabel; #define glGetObjectLabel sf_glad_glGetObjectLabel GLAD_API_CALL PFNGLGETOBJECTPARAMETERFVARBPROC sf_glad_glGetObjectParameterfvARB; @@ -3426,6 +5491,10 @@ GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERDVARBPROC sf_glad_glGetProgramEnvParame #define glGetProgramEnvParameterdvARB sf_glad_glGetProgramEnvParameterdvARB GLAD_API_CALL PFNGLGETPROGRAMENVPARAMETERFVARBPROC sf_glad_glGetProgramEnvParameterfvARB; #define glGetProgramEnvParameterfvARB sf_glad_glGetProgramEnvParameterfvARB +GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC sf_glad_glGetProgramInfoLog; +#define glGetProgramInfoLog sf_glad_glGetProgramInfoLog +GLAD_API_CALL PFNGLGETPROGRAMINTERFACEIVPROC sf_glad_glGetProgramInterfaceiv; +#define glGetProgramInterfaceiv sf_glad_glGetProgramInterfaceiv GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC sf_glad_glGetProgramLocalParameterdvARB; #define glGetProgramLocalParameterdvARB sf_glad_glGetProgramLocalParameterdvARB GLAD_API_CALL PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC sf_glad_glGetProgramLocalParameterfvARB; @@ -3438,26 +5507,82 @@ GLAD_API_CALL PFNGLGETPROGRAMPIPELINEINFOLOGPROC sf_glad_glGetProgramPipelineInf #define glGetProgramPipelineInfoLog sf_glad_glGetProgramPipelineInfoLog GLAD_API_CALL PFNGLGETPROGRAMPIPELINEIVPROC sf_glad_glGetProgramPipelineiv; #define glGetProgramPipelineiv sf_glad_glGetProgramPipelineiv +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEINDEXPROC sf_glad_glGetProgramResourceIndex; +#define glGetProgramResourceIndex sf_glad_glGetProgramResourceIndex +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONPROC sf_glad_glGetProgramResourceLocation; +#define glGetProgramResourceLocation sf_glad_glGetProgramResourceLocation +GLAD_API_CALL PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC sf_glad_glGetProgramResourceLocationIndex; +#define glGetProgramResourceLocationIndex sf_glad_glGetProgramResourceLocationIndex +GLAD_API_CALL PFNGLGETPROGRAMRESOURCENAMEPROC sf_glad_glGetProgramResourceName; +#define glGetProgramResourceName sf_glad_glGetProgramResourceName +GLAD_API_CALL PFNGLGETPROGRAMRESOURCEIVPROC sf_glad_glGetProgramResourceiv; +#define glGetProgramResourceiv sf_glad_glGetProgramResourceiv +GLAD_API_CALL PFNGLGETPROGRAMSTAGEIVPROC sf_glad_glGetProgramStageiv; +#define glGetProgramStageiv sf_glad_glGetProgramStageiv GLAD_API_CALL PFNGLGETPROGRAMSTRINGARBPROC sf_glad_glGetProgramStringARB; #define glGetProgramStringARB sf_glad_glGetProgramStringARB GLAD_API_CALL PFNGLGETPROGRAMSTRINGNVPROC sf_glad_glGetProgramStringNV; #define glGetProgramStringNV sf_glad_glGetProgramStringNV +GLAD_API_CALL PFNGLGETPROGRAMIVPROC sf_glad_glGetProgramiv; +#define glGetProgramiv sf_glad_glGetProgramiv GLAD_API_CALL PFNGLGETPROGRAMIVARBPROC sf_glad_glGetProgramivARB; #define glGetProgramivARB sf_glad_glGetProgramivARB GLAD_API_CALL PFNGLGETPROGRAMIVNVPROC sf_glad_glGetProgramivNV; #define glGetProgramivNV sf_glad_glGetProgramivNV +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTI64VPROC sf_glad_glGetQueryBufferObjecti64v; +#define glGetQueryBufferObjecti64v sf_glad_glGetQueryBufferObjecti64v +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTIVPROC sf_glad_glGetQueryBufferObjectiv; +#define glGetQueryBufferObjectiv sf_glad_glGetQueryBufferObjectiv +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUI64VPROC sf_glad_glGetQueryBufferObjectui64v; +#define glGetQueryBufferObjectui64v sf_glad_glGetQueryBufferObjectui64v +GLAD_API_CALL PFNGLGETQUERYBUFFEROBJECTUIVPROC sf_glad_glGetQueryBufferObjectuiv; +#define glGetQueryBufferObjectuiv sf_glad_glGetQueryBufferObjectuiv +GLAD_API_CALL PFNGLGETQUERYINDEXEDIVPROC sf_glad_glGetQueryIndexediv; +#define glGetQueryIndexediv sf_glad_glGetQueryIndexediv +GLAD_API_CALL PFNGLGETQUERYOBJECTI64VPROC sf_glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v sf_glad_glGetQueryObjecti64v +GLAD_API_CALL PFNGLGETQUERYOBJECTIVPROC sf_glad_glGetQueryObjectiv; +#define glGetQueryObjectiv sf_glad_glGetQueryObjectiv +GLAD_API_CALL PFNGLGETQUERYOBJECTUI64VPROC sf_glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v sf_glad_glGetQueryObjectui64v +GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC sf_glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv sf_glad_glGetQueryObjectuiv +GLAD_API_CALL PFNGLGETQUERYIVPROC sf_glad_glGetQueryiv; +#define glGetQueryiv sf_glad_glGetQueryiv GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC sf_glad_glGetRenderbufferParameteriv; #define glGetRenderbufferParameteriv sf_glad_glGetRenderbufferParameteriv GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC sf_glad_glGetRenderbufferParameterivEXT; #define glGetRenderbufferParameterivEXT sf_glad_glGetRenderbufferParameterivEXT +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIIVPROC sf_glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv sf_glad_glGetSamplerParameterIiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIUIVPROC sf_glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv sf_glad_glGetSamplerParameterIuiv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC sf_glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv sf_glad_glGetSamplerParameterfv +GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC sf_glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv sf_glad_glGetSamplerParameteriv GLAD_API_CALL PFNGLGETSEPARABLEFILTERPROC sf_glad_glGetSeparableFilter; #define glGetSeparableFilter sf_glad_glGetSeparableFilter +GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC sf_glad_glGetShaderInfoLog; +#define glGetShaderInfoLog sf_glad_glGetShaderInfoLog +GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC sf_glad_glGetShaderPrecisionFormat; +#define glGetShaderPrecisionFormat sf_glad_glGetShaderPrecisionFormat GLAD_API_CALL PFNGLGETSHADERSOURCEPROC sf_glad_glGetShaderSource; #define glGetShaderSource sf_glad_glGetShaderSource GLAD_API_CALL PFNGLGETSHADERSOURCEARBPROC sf_glad_glGetShaderSourceARB; #define glGetShaderSourceARB sf_glad_glGetShaderSourceARB +GLAD_API_CALL PFNGLGETSHADERIVPROC sf_glad_glGetShaderiv; +#define glGetShaderiv sf_glad_glGetShaderiv GLAD_API_CALL PFNGLGETSTRINGPROC sf_glad_glGetString; #define glGetString sf_glad_glGetString +GLAD_API_CALL PFNGLGETSTRINGIPROC sf_glad_glGetStringi; +#define glGetStringi sf_glad_glGetStringi +GLAD_API_CALL PFNGLGETSUBROUTINEINDEXPROC sf_glad_glGetSubroutineIndex; +#define glGetSubroutineIndex sf_glad_glGetSubroutineIndex +GLAD_API_CALL PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC sf_glad_glGetSubroutineUniformLocation; +#define glGetSubroutineUniformLocation sf_glad_glGetSubroutineUniformLocation +GLAD_API_CALL PFNGLGETSYNCIVPROC sf_glad_glGetSynciv; +#define glGetSynciv sf_glad_glGetSynciv GLAD_API_CALL PFNGLGETTEXENVFVPROC sf_glad_glGetTexEnvfv; #define glGetTexEnvfv sf_glad_glGetTexEnvfv GLAD_API_CALL PFNGLGETTEXENVIVPROC sf_glad_glGetTexEnviv; @@ -3474,16 +5599,52 @@ GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERFVPROC sf_glad_glGetTexLevelParameterfv; #define glGetTexLevelParameterfv sf_glad_glGetTexLevelParameterfv GLAD_API_CALL PFNGLGETTEXLEVELPARAMETERIVPROC sf_glad_glGetTexLevelParameteriv; #define glGetTexLevelParameteriv sf_glad_glGetTexLevelParameteriv +GLAD_API_CALL PFNGLGETTEXPARAMETERIIVPROC sf_glad_glGetTexParameterIiv; +#define glGetTexParameterIiv sf_glad_glGetTexParameterIiv +GLAD_API_CALL PFNGLGETTEXPARAMETERIUIVPROC sf_glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv sf_glad_glGetTexParameterIuiv GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC sf_glad_glGetTexParameterfv; #define glGetTexParameterfv sf_glad_glGetTexParameterfv GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC sf_glad_glGetTexParameteriv; #define glGetTexParameteriv sf_glad_glGetTexParameteriv +GLAD_API_CALL PFNGLGETTEXTUREIMAGEPROC sf_glad_glGetTextureImage; +#define glGetTextureImage sf_glad_glGetTextureImage +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERFVPROC sf_glad_glGetTextureLevelParameterfv; +#define glGetTextureLevelParameterfv sf_glad_glGetTextureLevelParameterfv +GLAD_API_CALL PFNGLGETTEXTURELEVELPARAMETERIVPROC sf_glad_glGetTextureLevelParameteriv; +#define glGetTextureLevelParameteriv sf_glad_glGetTextureLevelParameteriv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIIVPROC sf_glad_glGetTextureParameterIiv; +#define glGetTextureParameterIiv sf_glad_glGetTextureParameterIiv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIUIVPROC sf_glad_glGetTextureParameterIuiv; +#define glGetTextureParameterIuiv sf_glad_glGetTextureParameterIuiv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERFVPROC sf_glad_glGetTextureParameterfv; +#define glGetTextureParameterfv sf_glad_glGetTextureParameterfv +GLAD_API_CALL PFNGLGETTEXTUREPARAMETERIVPROC sf_glad_glGetTextureParameteriv; +#define glGetTextureParameteriv sf_glad_glGetTextureParameteriv +GLAD_API_CALL PFNGLGETTEXTURESUBIMAGEPROC sf_glad_glGetTextureSubImage; +#define glGetTextureSubImage sf_glad_glGetTextureSubImage GLAD_API_CALL PFNGLGETTRACKMATRIXIVNVPROC sf_glad_glGetTrackMatrixivNV; #define glGetTrackMatrixivNV sf_glad_glGetTrackMatrixivNV +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC sf_glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying sf_glad_glGetTransformFeedbackVarying +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI64_VPROC sf_glad_glGetTransformFeedbacki64_v; +#define glGetTransformFeedbacki64_v sf_glad_glGetTransformFeedbacki64_v +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKI_VPROC sf_glad_glGetTransformFeedbacki_v; +#define glGetTransformFeedbacki_v sf_glad_glGetTransformFeedbacki_v +GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKIVPROC sf_glad_glGetTransformFeedbackiv; +#define glGetTransformFeedbackiv sf_glad_glGetTransformFeedbackiv +GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC sf_glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex sf_glad_glGetUniformBlockIndex +GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC sf_glad_glGetUniformIndices; +#define glGetUniformIndices sf_glad_glGetUniformIndices GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC sf_glad_glGetUniformLocation; #define glGetUniformLocation sf_glad_glGetUniformLocation GLAD_API_CALL PFNGLGETUNIFORMLOCATIONARBPROC sf_glad_glGetUniformLocationARB; #define glGetUniformLocationARB sf_glad_glGetUniformLocationARB +GLAD_API_CALL PFNGLGETUNIFORMSUBROUTINEUIVPROC sf_glad_glGetUniformSubroutineuiv; +#define glGetUniformSubroutineuiv sf_glad_glGetUniformSubroutineuiv +GLAD_API_CALL PFNGLGETUNIFORMDVPROC sf_glad_glGetUniformdv; +#define glGetUniformdv sf_glad_glGetUniformdv GLAD_API_CALL PFNGLGETUNIFORMFVPROC sf_glad_glGetUniformfv; #define glGetUniformfv sf_glad_glGetUniformfv GLAD_API_CALL PFNGLGETUNIFORMFVARBPROC sf_glad_glGetUniformfvARB; @@ -3492,6 +5653,20 @@ GLAD_API_CALL PFNGLGETUNIFORMIVPROC sf_glad_glGetUniformiv; #define glGetUniformiv sf_glad_glGetUniformiv GLAD_API_CALL PFNGLGETUNIFORMIVARBPROC sf_glad_glGetUniformivARB; #define glGetUniformivARB sf_glad_glGetUniformivARB +GLAD_API_CALL PFNGLGETUNIFORMUIVPROC sf_glad_glGetUniformuiv; +#define glGetUniformuiv sf_glad_glGetUniformuiv +GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXED64IVPROC sf_glad_glGetVertexArrayIndexed64iv; +#define glGetVertexArrayIndexed64iv sf_glad_glGetVertexArrayIndexed64iv +GLAD_API_CALL PFNGLGETVERTEXARRAYINDEXEDIVPROC sf_glad_glGetVertexArrayIndexediv; +#define glGetVertexArrayIndexediv sf_glad_glGetVertexArrayIndexediv +GLAD_API_CALL PFNGLGETVERTEXARRAYIVPROC sf_glad_glGetVertexArrayiv; +#define glGetVertexArrayiv sf_glad_glGetVertexArrayiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC sf_glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv sf_glad_glGetVertexAttribIiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC sf_glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv sf_glad_glGetVertexAttribIuiv +GLAD_API_CALL PFNGLGETVERTEXATTRIBLDVPROC sf_glad_glGetVertexAttribLdv; +#define glGetVertexAttribLdv sf_glad_glGetVertexAttribLdv GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC sf_glad_glGetVertexAttribPointerv; #define glGetVertexAttribPointerv sf_glad_glGetVertexAttribPointerv GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVARBPROC sf_glad_glGetVertexAttribPointervARB; @@ -3516,6 +5691,42 @@ GLAD_API_CALL PFNGLGETVERTEXATTRIBIVARBPROC sf_glad_glGetVertexAttribivARB; #define glGetVertexAttribivARB sf_glad_glGetVertexAttribivARB GLAD_API_CALL PFNGLGETVERTEXATTRIBIVNVPROC sf_glad_glGetVertexAttribivNV; #define glGetVertexAttribivNV sf_glad_glGetVertexAttribivNV +GLAD_API_CALL PFNGLGETNCOLORTABLEPROC sf_glad_glGetnColorTable; +#define glGetnColorTable sf_glad_glGetnColorTable +GLAD_API_CALL PFNGLGETNCOMPRESSEDTEXIMAGEPROC sf_glad_glGetnCompressedTexImage; +#define glGetnCompressedTexImage sf_glad_glGetnCompressedTexImage +GLAD_API_CALL PFNGLGETNCONVOLUTIONFILTERPROC sf_glad_glGetnConvolutionFilter; +#define glGetnConvolutionFilter sf_glad_glGetnConvolutionFilter +GLAD_API_CALL PFNGLGETNHISTOGRAMPROC sf_glad_glGetnHistogram; +#define glGetnHistogram sf_glad_glGetnHistogram +GLAD_API_CALL PFNGLGETNMAPDVPROC sf_glad_glGetnMapdv; +#define glGetnMapdv sf_glad_glGetnMapdv +GLAD_API_CALL PFNGLGETNMAPFVPROC sf_glad_glGetnMapfv; +#define glGetnMapfv sf_glad_glGetnMapfv +GLAD_API_CALL PFNGLGETNMAPIVPROC sf_glad_glGetnMapiv; +#define glGetnMapiv sf_glad_glGetnMapiv +GLAD_API_CALL PFNGLGETNMINMAXPROC sf_glad_glGetnMinmax; +#define glGetnMinmax sf_glad_glGetnMinmax +GLAD_API_CALL PFNGLGETNPIXELMAPFVPROC sf_glad_glGetnPixelMapfv; +#define glGetnPixelMapfv sf_glad_glGetnPixelMapfv +GLAD_API_CALL PFNGLGETNPIXELMAPUIVPROC sf_glad_glGetnPixelMapuiv; +#define glGetnPixelMapuiv sf_glad_glGetnPixelMapuiv +GLAD_API_CALL PFNGLGETNPIXELMAPUSVPROC sf_glad_glGetnPixelMapusv; +#define glGetnPixelMapusv sf_glad_glGetnPixelMapusv +GLAD_API_CALL PFNGLGETNPOLYGONSTIPPLEPROC sf_glad_glGetnPolygonStipple; +#define glGetnPolygonStipple sf_glad_glGetnPolygonStipple +GLAD_API_CALL PFNGLGETNSEPARABLEFILTERPROC sf_glad_glGetnSeparableFilter; +#define glGetnSeparableFilter sf_glad_glGetnSeparableFilter +GLAD_API_CALL PFNGLGETNTEXIMAGEPROC sf_glad_glGetnTexImage; +#define glGetnTexImage sf_glad_glGetnTexImage +GLAD_API_CALL PFNGLGETNUNIFORMDVPROC sf_glad_glGetnUniformdv; +#define glGetnUniformdv sf_glad_glGetnUniformdv +GLAD_API_CALL PFNGLGETNUNIFORMFVPROC sf_glad_glGetnUniformfv; +#define glGetnUniformfv sf_glad_glGetnUniformfv +GLAD_API_CALL PFNGLGETNUNIFORMIVPROC sf_glad_glGetnUniformiv; +#define glGetnUniformiv sf_glad_glGetnUniformiv +GLAD_API_CALL PFNGLGETNUNIFORMUIVPROC sf_glad_glGetnUniformuiv; +#define glGetnUniformuiv sf_glad_glGetnUniformuiv GLAD_API_CALL PFNGLHINTPROC sf_glad_glHint; #define glHint sf_glad_glHint GLAD_API_CALL PFNGLHISTOGRAMPROC sf_glad_glHistogram; @@ -3550,32 +5761,64 @@ GLAD_API_CALL PFNGLINITNAMESPROC sf_glad_glInitNames; #define glInitNames sf_glad_glInitNames GLAD_API_CALL PFNGLINTERLEAVEDARRAYSPROC sf_glad_glInterleavedArrays; #define glInterleavedArrays sf_glad_glInterleavedArrays +GLAD_API_CALL PFNGLINVALIDATEBUFFERDATAPROC sf_glad_glInvalidateBufferData; +#define glInvalidateBufferData sf_glad_glInvalidateBufferData +GLAD_API_CALL PFNGLINVALIDATEBUFFERSUBDATAPROC sf_glad_glInvalidateBufferSubData; +#define glInvalidateBufferSubData sf_glad_glInvalidateBufferSubData +GLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC sf_glad_glInvalidateFramebuffer; +#define glInvalidateFramebuffer sf_glad_glInvalidateFramebuffer +GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC sf_glad_glInvalidateNamedFramebufferData; +#define glInvalidateNamedFramebufferData sf_glad_glInvalidateNamedFramebufferData +GLAD_API_CALL PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC sf_glad_glInvalidateNamedFramebufferSubData; +#define glInvalidateNamedFramebufferSubData sf_glad_glInvalidateNamedFramebufferSubData +GLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC sf_glad_glInvalidateSubFramebuffer; +#define glInvalidateSubFramebuffer sf_glad_glInvalidateSubFramebuffer +GLAD_API_CALL PFNGLINVALIDATETEXIMAGEPROC sf_glad_glInvalidateTexImage; +#define glInvalidateTexImage sf_glad_glInvalidateTexImage +GLAD_API_CALL PFNGLINVALIDATETEXSUBIMAGEPROC sf_glad_glInvalidateTexSubImage; +#define glInvalidateTexSubImage sf_glad_glInvalidateTexSubImage GLAD_API_CALL PFNGLISBUFFERPROC sf_glad_glIsBuffer; #define glIsBuffer sf_glad_glIsBuffer GLAD_API_CALL PFNGLISBUFFERARBPROC sf_glad_glIsBufferARB; #define glIsBufferARB sf_glad_glIsBufferARB GLAD_API_CALL PFNGLISENABLEDPROC sf_glad_glIsEnabled; #define glIsEnabled sf_glad_glIsEnabled +GLAD_API_CALL PFNGLISENABLEDIPROC sf_glad_glIsEnabledi; +#define glIsEnabledi sf_glad_glIsEnabledi GLAD_API_CALL PFNGLISFRAMEBUFFERPROC sf_glad_glIsFramebuffer; #define glIsFramebuffer sf_glad_glIsFramebuffer GLAD_API_CALL PFNGLISFRAMEBUFFEREXTPROC sf_glad_glIsFramebufferEXT; #define glIsFramebufferEXT sf_glad_glIsFramebufferEXT GLAD_API_CALL PFNGLISLISTPROC sf_glad_glIsList; #define glIsList sf_glad_glIsList +GLAD_API_CALL PFNGLISPROGRAMPROC sf_glad_glIsProgram; +#define glIsProgram sf_glad_glIsProgram GLAD_API_CALL PFNGLISPROGRAMARBPROC sf_glad_glIsProgramARB; #define glIsProgramARB sf_glad_glIsProgramARB GLAD_API_CALL PFNGLISPROGRAMNVPROC sf_glad_glIsProgramNV; #define glIsProgramNV sf_glad_glIsProgramNV GLAD_API_CALL PFNGLISPROGRAMPIPELINEPROC sf_glad_glIsProgramPipeline; #define glIsProgramPipeline sf_glad_glIsProgramPipeline +GLAD_API_CALL PFNGLISQUERYPROC sf_glad_glIsQuery; +#define glIsQuery sf_glad_glIsQuery GLAD_API_CALL PFNGLISRENDERBUFFERPROC sf_glad_glIsRenderbuffer; #define glIsRenderbuffer sf_glad_glIsRenderbuffer GLAD_API_CALL PFNGLISRENDERBUFFEREXTPROC sf_glad_glIsRenderbufferEXT; #define glIsRenderbufferEXT sf_glad_glIsRenderbufferEXT +GLAD_API_CALL PFNGLISSAMPLERPROC sf_glad_glIsSampler; +#define glIsSampler sf_glad_glIsSampler +GLAD_API_CALL PFNGLISSHADERPROC sf_glad_glIsShader; +#define glIsShader sf_glad_glIsShader +GLAD_API_CALL PFNGLISSYNCPROC sf_glad_glIsSync; +#define glIsSync sf_glad_glIsSync GLAD_API_CALL PFNGLISTEXTUREPROC sf_glad_glIsTexture; #define glIsTexture sf_glad_glIsTexture GLAD_API_CALL PFNGLISTEXTUREEXTPROC sf_glad_glIsTextureEXT; #define glIsTextureEXT sf_glad_glIsTextureEXT +GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC sf_glad_glIsTransformFeedback; +#define glIsTransformFeedback sf_glad_glIsTransformFeedback +GLAD_API_CALL PFNGLISVERTEXARRAYPROC sf_glad_glIsVertexArray; +#define glIsVertexArray sf_glad_glIsVertexArray GLAD_API_CALL PFNGLLIGHTMODELFPROC sf_glad_glLightModelf; #define glLightModelf sf_glad_glLightModelf GLAD_API_CALL PFNGLLIGHTMODELFVPROC sf_glad_glLightModelfv; @@ -3612,6 +5855,10 @@ GLAD_API_CALL PFNGLLOADNAMEPROC sf_glad_glLoadName; #define glLoadName sf_glad_glLoadName GLAD_API_CALL PFNGLLOADPROGRAMNVPROC sf_glad_glLoadProgramNV; #define glLoadProgramNV sf_glad_glLoadProgramNV +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXDPROC sf_glad_glLoadTransposeMatrixd; +#define glLoadTransposeMatrixd sf_glad_glLoadTransposeMatrixd +GLAD_API_CALL PFNGLLOADTRANSPOSEMATRIXFPROC sf_glad_glLoadTransposeMatrixf; +#define glLoadTransposeMatrixf sf_glad_glLoadTransposeMatrixf GLAD_API_CALL PFNGLLOGICOPPROC sf_glad_glLogicOp; #define glLogicOp sf_glad_glLogicOp GLAD_API_CALL PFNGLMAP1DPROC sf_glad_glMap1d; @@ -3626,6 +5873,8 @@ GLAD_API_CALL PFNGLMAPBUFFERPROC sf_glad_glMapBuffer; #define glMapBuffer sf_glad_glMapBuffer GLAD_API_CALL PFNGLMAPBUFFERARBPROC sf_glad_glMapBufferARB; #define glMapBufferARB sf_glad_glMapBufferARB +GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC sf_glad_glMapBufferRange; +#define glMapBufferRange sf_glad_glMapBufferRange GLAD_API_CALL PFNGLMAPGRID1DPROC sf_glad_glMapGrid1d; #define glMapGrid1d sf_glad_glMapGrid1d GLAD_API_CALL PFNGLMAPGRID1FPROC sf_glad_glMapGrid1f; @@ -3634,6 +5883,10 @@ GLAD_API_CALL PFNGLMAPGRID2DPROC sf_glad_glMapGrid2d; #define glMapGrid2d sf_glad_glMapGrid2d GLAD_API_CALL PFNGLMAPGRID2FPROC sf_glad_glMapGrid2f; #define glMapGrid2f sf_glad_glMapGrid2f +GLAD_API_CALL PFNGLMAPNAMEDBUFFERPROC sf_glad_glMapNamedBuffer; +#define glMapNamedBuffer sf_glad_glMapNamedBuffer +GLAD_API_CALL PFNGLMAPNAMEDBUFFERRANGEPROC sf_glad_glMapNamedBufferRange; +#define glMapNamedBufferRange sf_glad_glMapNamedBufferRange GLAD_API_CALL PFNGLMATERIALFPROC sf_glad_glMaterialf; #define glMaterialf sf_glad_glMaterialf GLAD_API_CALL PFNGLMATERIALFVPROC sf_glad_glMaterialfv; @@ -3644,12 +5897,36 @@ GLAD_API_CALL PFNGLMATERIALIVPROC sf_glad_glMaterialiv; #define glMaterialiv sf_glad_glMaterialiv GLAD_API_CALL PFNGLMATRIXMODEPROC sf_glad_glMatrixMode; #define glMatrixMode sf_glad_glMatrixMode +GLAD_API_CALL PFNGLMEMORYBARRIERPROC sf_glad_glMemoryBarrier; +#define glMemoryBarrier sf_glad_glMemoryBarrier +GLAD_API_CALL PFNGLMEMORYBARRIERBYREGIONPROC sf_glad_glMemoryBarrierByRegion; +#define glMemoryBarrierByRegion sf_glad_glMemoryBarrierByRegion +GLAD_API_CALL PFNGLMINSAMPLESHADINGPROC sf_glad_glMinSampleShading; +#define glMinSampleShading sf_glad_glMinSampleShading GLAD_API_CALL PFNGLMINMAXPROC sf_glad_glMinmax; #define glMinmax sf_glad_glMinmax GLAD_API_CALL PFNGLMULTMATRIXDPROC sf_glad_glMultMatrixd; #define glMultMatrixd sf_glad_glMultMatrixd GLAD_API_CALL PFNGLMULTMATRIXFPROC sf_glad_glMultMatrixf; #define glMultMatrixf sf_glad_glMultMatrixf +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXDPROC sf_glad_glMultTransposeMatrixd; +#define glMultTransposeMatrixd sf_glad_glMultTransposeMatrixd +GLAD_API_CALL PFNGLMULTTRANSPOSEMATRIXFPROC sf_glad_glMultTransposeMatrixf; +#define glMultTransposeMatrixf sf_glad_glMultTransposeMatrixf +GLAD_API_CALL PFNGLMULTIDRAWARRAYSPROC sf_glad_glMultiDrawArrays; +#define glMultiDrawArrays sf_glad_glMultiDrawArrays +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTPROC sf_glad_glMultiDrawArraysIndirect; +#define glMultiDrawArraysIndirect sf_glad_glMultiDrawArraysIndirect +GLAD_API_CALL PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC sf_glad_glMultiDrawArraysIndirectCount; +#define glMultiDrawArraysIndirectCount sf_glad_glMultiDrawArraysIndirectCount +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSPROC sf_glad_glMultiDrawElements; +#define glMultiDrawElements sf_glad_glMultiDrawElements +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC sf_glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex sf_glad_glMultiDrawElementsBaseVertex +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTPROC sf_glad_glMultiDrawElementsIndirect; +#define glMultiDrawElementsIndirect sf_glad_glMultiDrawElementsIndirect +GLAD_API_CALL PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC sf_glad_glMultiDrawElementsIndirectCount; +#define glMultiDrawElementsIndirectCount sf_glad_glMultiDrawElementsIndirectCount GLAD_API_CALL PFNGLMULTITEXCOORD1DPROC sf_glad_glMultiTexCoord1d; #define glMultiTexCoord1d sf_glad_glMultiTexCoord1d GLAD_API_CALL PFNGLMULTITEXCOORD1DARBPROC sf_glad_glMultiTexCoord1dARB; @@ -3778,6 +6055,46 @@ GLAD_API_CALL PFNGLMULTITEXCOORD4SVPROC sf_glad_glMultiTexCoord4sv; #define glMultiTexCoord4sv sf_glad_glMultiTexCoord4sv GLAD_API_CALL PFNGLMULTITEXCOORD4SVARBPROC sf_glad_glMultiTexCoord4svARB; #define glMultiTexCoord4svARB sf_glad_glMultiTexCoord4svARB +GLAD_API_CALL PFNGLMULTITEXCOORDP1UIPROC sf_glad_glMultiTexCoordP1ui; +#define glMultiTexCoordP1ui sf_glad_glMultiTexCoordP1ui +GLAD_API_CALL PFNGLMULTITEXCOORDP1UIVPROC sf_glad_glMultiTexCoordP1uiv; +#define glMultiTexCoordP1uiv sf_glad_glMultiTexCoordP1uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP2UIPROC sf_glad_glMultiTexCoordP2ui; +#define glMultiTexCoordP2ui sf_glad_glMultiTexCoordP2ui +GLAD_API_CALL PFNGLMULTITEXCOORDP2UIVPROC sf_glad_glMultiTexCoordP2uiv; +#define glMultiTexCoordP2uiv sf_glad_glMultiTexCoordP2uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP3UIPROC sf_glad_glMultiTexCoordP3ui; +#define glMultiTexCoordP3ui sf_glad_glMultiTexCoordP3ui +GLAD_API_CALL PFNGLMULTITEXCOORDP3UIVPROC sf_glad_glMultiTexCoordP3uiv; +#define glMultiTexCoordP3uiv sf_glad_glMultiTexCoordP3uiv +GLAD_API_CALL PFNGLMULTITEXCOORDP4UIPROC sf_glad_glMultiTexCoordP4ui; +#define glMultiTexCoordP4ui sf_glad_glMultiTexCoordP4ui +GLAD_API_CALL PFNGLMULTITEXCOORDP4UIVPROC sf_glad_glMultiTexCoordP4uiv; +#define glMultiTexCoordP4uiv sf_glad_glMultiTexCoordP4uiv +GLAD_API_CALL PFNGLNAMEDBUFFERDATAPROC sf_glad_glNamedBufferData; +#define glNamedBufferData sf_glad_glNamedBufferData +GLAD_API_CALL PFNGLNAMEDBUFFERSTORAGEPROC sf_glad_glNamedBufferStorage; +#define glNamedBufferStorage sf_glad_glNamedBufferStorage +GLAD_API_CALL PFNGLNAMEDBUFFERSUBDATAPROC sf_glad_glNamedBufferSubData; +#define glNamedBufferSubData sf_glad_glNamedBufferSubData +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC sf_glad_glNamedFramebufferDrawBuffer; +#define glNamedFramebufferDrawBuffer sf_glad_glNamedFramebufferDrawBuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC sf_glad_glNamedFramebufferDrawBuffers; +#define glNamedFramebufferDrawBuffers sf_glad_glNamedFramebufferDrawBuffers +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC sf_glad_glNamedFramebufferParameteri; +#define glNamedFramebufferParameteri sf_glad_glNamedFramebufferParameteri +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC sf_glad_glNamedFramebufferReadBuffer; +#define glNamedFramebufferReadBuffer sf_glad_glNamedFramebufferReadBuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC sf_glad_glNamedFramebufferRenderbuffer; +#define glNamedFramebufferRenderbuffer sf_glad_glNamedFramebufferRenderbuffer +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTUREPROC sf_glad_glNamedFramebufferTexture; +#define glNamedFramebufferTexture sf_glad_glNamedFramebufferTexture +GLAD_API_CALL PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC sf_glad_glNamedFramebufferTextureLayer; +#define glNamedFramebufferTextureLayer sf_glad_glNamedFramebufferTextureLayer +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEPROC sf_glad_glNamedRenderbufferStorage; +#define glNamedRenderbufferStorage sf_glad_glNamedRenderbufferStorage +GLAD_API_CALL PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC sf_glad_glNamedRenderbufferStorageMultisample; +#define glNamedRenderbufferStorageMultisample sf_glad_glNamedRenderbufferStorageMultisample GLAD_API_CALL PFNGLNEWLISTPROC sf_glad_glNewList; #define glNewList sf_glad_glNewList GLAD_API_CALL PFNGLNORMAL3BPROC sf_glad_glNormal3b; @@ -3800,6 +6117,10 @@ GLAD_API_CALL PFNGLNORMAL3SPROC sf_glad_glNormal3s; #define glNormal3s sf_glad_glNormal3s GLAD_API_CALL PFNGLNORMAL3SVPROC sf_glad_glNormal3sv; #define glNormal3sv sf_glad_glNormal3sv +GLAD_API_CALL PFNGLNORMALP3UIPROC sf_glad_glNormalP3ui; +#define glNormalP3ui sf_glad_glNormalP3ui +GLAD_API_CALL PFNGLNORMALP3UIVPROC sf_glad_glNormalP3uiv; +#define glNormalP3uiv sf_glad_glNormalP3uiv GLAD_API_CALL PFNGLNORMALPOINTERPROC sf_glad_glNormalPointer; #define glNormalPointer sf_glad_glNormalPointer GLAD_API_CALL PFNGLNORMALPOINTEREXTPROC sf_glad_glNormalPointerEXT; @@ -3810,8 +6131,16 @@ GLAD_API_CALL PFNGLOBJECTPTRLABELPROC sf_glad_glObjectPtrLabel; #define glObjectPtrLabel sf_glad_glObjectPtrLabel GLAD_API_CALL PFNGLORTHOPROC sf_glad_glOrtho; #define glOrtho sf_glad_glOrtho +GLAD_API_CALL PFNGLORTHOFOESPROC sf_glad_glOrthofOES; +#define glOrthofOES sf_glad_glOrthofOES GLAD_API_CALL PFNGLPASSTHROUGHPROC sf_glad_glPassThrough; #define glPassThrough sf_glad_glPassThrough +GLAD_API_CALL PFNGLPATCHPARAMETERFVPROC sf_glad_glPatchParameterfv; +#define glPatchParameterfv sf_glad_glPatchParameterfv +GLAD_API_CALL PFNGLPATCHPARAMETERIPROC sf_glad_glPatchParameteri; +#define glPatchParameteri sf_glad_glPatchParameteri +GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC sf_glad_glPauseTransformFeedback; +#define glPauseTransformFeedback sf_glad_glPauseTransformFeedback GLAD_API_CALL PFNGLPIXELMAPFVPROC sf_glad_glPixelMapfv; #define glPixelMapfv sf_glad_glPixelMapfv GLAD_API_CALL PFNGLPIXELMAPUIVPROC sf_glad_glPixelMapuiv; @@ -3828,12 +6157,22 @@ GLAD_API_CALL PFNGLPIXELTRANSFERIPROC sf_glad_glPixelTransferi; #define glPixelTransferi sf_glad_glPixelTransferi GLAD_API_CALL PFNGLPIXELZOOMPROC sf_glad_glPixelZoom; #define glPixelZoom sf_glad_glPixelZoom +GLAD_API_CALL PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf; +#define glPointParameterf sf_glad_glPointParameterf +GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv; +#define glPointParameterfv sf_glad_glPointParameterfv +GLAD_API_CALL PFNGLPOINTPARAMETERIPROC sf_glad_glPointParameteri; +#define glPointParameteri sf_glad_glPointParameteri +GLAD_API_CALL PFNGLPOINTPARAMETERIVPROC sf_glad_glPointParameteriv; +#define glPointParameteriv sf_glad_glPointParameteriv GLAD_API_CALL PFNGLPOINTSIZEPROC sf_glad_glPointSize; #define glPointSize sf_glad_glPointSize GLAD_API_CALL PFNGLPOLYGONMODEPROC sf_glad_glPolygonMode; #define glPolygonMode sf_glad_glPolygonMode GLAD_API_CALL PFNGLPOLYGONOFFSETPROC sf_glad_glPolygonOffset; #define glPolygonOffset sf_glad_glPolygonOffset +GLAD_API_CALL PFNGLPOLYGONOFFSETCLAMPPROC sf_glad_glPolygonOffsetClamp; +#define glPolygonOffsetClamp sf_glad_glPolygonOffsetClamp GLAD_API_CALL PFNGLPOLYGONSTIPPLEPROC sf_glad_glPolygonStipple; #define glPolygonStipple sf_glad_glPolygonStipple GLAD_API_CALL PFNGLPOPATTRIBPROC sf_glad_glPopAttrib; @@ -3846,6 +6185,8 @@ GLAD_API_CALL PFNGLPOPMATRIXPROC sf_glad_glPopMatrix; #define glPopMatrix sf_glad_glPopMatrix GLAD_API_CALL PFNGLPOPNAMEPROC sf_glad_glPopName; #define glPopName sf_glad_glPopName +GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC sf_glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex sf_glad_glPrimitiveRestartIndex GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC sf_glad_glPrioritizeTextures; #define glPrioritizeTextures sf_glad_glPrioritizeTextures GLAD_API_CALL PFNGLPRIORITIZETEXTURESEXTPROC sf_glad_glPrioritizeTexturesEXT; @@ -3990,6 +6331,8 @@ GLAD_API_CALL PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC sf_glad_glProgramUniformMatrix4 #define glProgramUniformMatrix4x3fv sf_glad_glProgramUniformMatrix4x3fv GLAD_API_CALL PFNGLPROGRAMVERTEXLIMITNVPROC sf_glad_glProgramVertexLimitNV; #define glProgramVertexLimitNV sf_glad_glProgramVertexLimitNV +GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC sf_glad_glProvokingVertex; +#define glProvokingVertex sf_glad_glProvokingVertex GLAD_API_CALL PFNGLPUSHATTRIBPROC sf_glad_glPushAttrib; #define glPushAttrib sf_glad_glPushAttrib GLAD_API_CALL PFNGLPUSHCLIENTATTRIBPROC sf_glad_glPushClientAttrib; @@ -4000,6 +6343,8 @@ GLAD_API_CALL PFNGLPUSHMATRIXPROC sf_glad_glPushMatrix; #define glPushMatrix sf_glad_glPushMatrix GLAD_API_CALL PFNGLPUSHNAMEPROC sf_glad_glPushName; #define glPushName sf_glad_glPushName +GLAD_API_CALL PFNGLQUERYCOUNTERPROC sf_glad_glQueryCounter; +#define glQueryCounter sf_glad_glQueryCounter GLAD_API_CALL PFNGLRASTERPOS2DPROC sf_glad_glRasterPos2d; #define glRasterPos2d sf_glad_glRasterPos2d GLAD_API_CALL PFNGLRASTERPOS2DVPROC sf_glad_glRasterPos2dv; @@ -4052,6 +6397,8 @@ GLAD_API_CALL PFNGLREADBUFFERPROC sf_glad_glReadBuffer; #define glReadBuffer sf_glad_glReadBuffer GLAD_API_CALL PFNGLREADPIXELSPROC sf_glad_glReadPixels; #define glReadPixels sf_glad_glReadPixels +GLAD_API_CALL PFNGLREADNPIXELSPROC sf_glad_glReadnPixels; +#define glReadnPixels sf_glad_glReadnPixels GLAD_API_CALL PFNGLRECTDPROC sf_glad_glRectd; #define glRectd sf_glad_glRectd GLAD_API_CALL PFNGLRECTDVPROC sf_glad_glRectdv; @@ -4068,6 +6415,8 @@ GLAD_API_CALL PFNGLRECTSPROC sf_glad_glRects; #define glRects sf_glad_glRects GLAD_API_CALL PFNGLRECTSVPROC sf_glad_glRectsv; #define glRectsv sf_glad_glRectsv +GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC sf_glad_glReleaseShaderCompiler; +#define glReleaseShaderCompiler sf_glad_glReleaseShaderCompiler GLAD_API_CALL PFNGLRENDERMODEPROC sf_glad_glRenderMode; #define glRenderMode sf_glad_glRenderMode GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC sf_glad_glRenderbufferStorage; @@ -4084,32 +6433,110 @@ GLAD_API_CALL PFNGLRESETHISTOGRAMPROC sf_glad_glResetHistogram; #define glResetHistogram sf_glad_glResetHistogram GLAD_API_CALL PFNGLRESETMINMAXPROC sf_glad_glResetMinmax; #define glResetMinmax sf_glad_glResetMinmax +GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC sf_glad_glResumeTransformFeedback; +#define glResumeTransformFeedback sf_glad_glResumeTransformFeedback GLAD_API_CALL PFNGLROTATEDPROC sf_glad_glRotated; #define glRotated sf_glad_glRotated GLAD_API_CALL PFNGLROTATEFPROC sf_glad_glRotatef; #define glRotatef sf_glad_glRotatef +GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage; +#define glSampleCoverage sf_glad_glSampleCoverage +GLAD_API_CALL PFNGLSAMPLEMASKIPROC sf_glad_glSampleMaski; +#define glSampleMaski sf_glad_glSampleMaski +GLAD_API_CALL PFNGLSAMPLERPARAMETERIIVPROC sf_glad_glSamplerParameterIiv; +#define glSamplerParameterIiv sf_glad_glSamplerParameterIiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIUIVPROC sf_glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv sf_glad_glSamplerParameterIuiv +GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC sf_glad_glSamplerParameterf; +#define glSamplerParameterf sf_glad_glSamplerParameterf +GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC sf_glad_glSamplerParameterfv; +#define glSamplerParameterfv sf_glad_glSamplerParameterfv +GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC sf_glad_glSamplerParameteri; +#define glSamplerParameteri sf_glad_glSamplerParameteri +GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC sf_glad_glSamplerParameteriv; +#define glSamplerParameteriv sf_glad_glSamplerParameteriv GLAD_API_CALL PFNGLSCALEDPROC sf_glad_glScaled; #define glScaled sf_glad_glScaled GLAD_API_CALL PFNGLSCALEFPROC sf_glad_glScalef; #define glScalef sf_glad_glScalef GLAD_API_CALL PFNGLSCISSORPROC sf_glad_glScissor; #define glScissor sf_glad_glScissor +GLAD_API_CALL PFNGLSCISSORARRAYVPROC sf_glad_glScissorArrayv; +#define glScissorArrayv sf_glad_glScissorArrayv +GLAD_API_CALL PFNGLSCISSORINDEXEDPROC sf_glad_glScissorIndexed; +#define glScissorIndexed sf_glad_glScissorIndexed +GLAD_API_CALL PFNGLSCISSORINDEXEDVPROC sf_glad_glScissorIndexedv; +#define glScissorIndexedv sf_glad_glScissorIndexedv +GLAD_API_CALL PFNGLSECONDARYCOLOR3BPROC sf_glad_glSecondaryColor3b; +#define glSecondaryColor3b sf_glad_glSecondaryColor3b +GLAD_API_CALL PFNGLSECONDARYCOLOR3BVPROC sf_glad_glSecondaryColor3bv; +#define glSecondaryColor3bv sf_glad_glSecondaryColor3bv +GLAD_API_CALL PFNGLSECONDARYCOLOR3DPROC sf_glad_glSecondaryColor3d; +#define glSecondaryColor3d sf_glad_glSecondaryColor3d +GLAD_API_CALL PFNGLSECONDARYCOLOR3DVPROC sf_glad_glSecondaryColor3dv; +#define glSecondaryColor3dv sf_glad_glSecondaryColor3dv +GLAD_API_CALL PFNGLSECONDARYCOLOR3FPROC sf_glad_glSecondaryColor3f; +#define glSecondaryColor3f sf_glad_glSecondaryColor3f +GLAD_API_CALL PFNGLSECONDARYCOLOR3FVPROC sf_glad_glSecondaryColor3fv; +#define glSecondaryColor3fv sf_glad_glSecondaryColor3fv +GLAD_API_CALL PFNGLSECONDARYCOLOR3IPROC sf_glad_glSecondaryColor3i; +#define glSecondaryColor3i sf_glad_glSecondaryColor3i +GLAD_API_CALL PFNGLSECONDARYCOLOR3IVPROC sf_glad_glSecondaryColor3iv; +#define glSecondaryColor3iv sf_glad_glSecondaryColor3iv +GLAD_API_CALL PFNGLSECONDARYCOLOR3SPROC sf_glad_glSecondaryColor3s; +#define glSecondaryColor3s sf_glad_glSecondaryColor3s +GLAD_API_CALL PFNGLSECONDARYCOLOR3SVPROC sf_glad_glSecondaryColor3sv; +#define glSecondaryColor3sv sf_glad_glSecondaryColor3sv +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBPROC sf_glad_glSecondaryColor3ub; +#define glSecondaryColor3ub sf_glad_glSecondaryColor3ub +GLAD_API_CALL PFNGLSECONDARYCOLOR3UBVPROC sf_glad_glSecondaryColor3ubv; +#define glSecondaryColor3ubv sf_glad_glSecondaryColor3ubv +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIPROC sf_glad_glSecondaryColor3ui; +#define glSecondaryColor3ui sf_glad_glSecondaryColor3ui +GLAD_API_CALL PFNGLSECONDARYCOLOR3UIVPROC sf_glad_glSecondaryColor3uiv; +#define glSecondaryColor3uiv sf_glad_glSecondaryColor3uiv +GLAD_API_CALL PFNGLSECONDARYCOLOR3USPROC sf_glad_glSecondaryColor3us; +#define glSecondaryColor3us sf_glad_glSecondaryColor3us +GLAD_API_CALL PFNGLSECONDARYCOLOR3USVPROC sf_glad_glSecondaryColor3usv; +#define glSecondaryColor3usv sf_glad_glSecondaryColor3usv +GLAD_API_CALL PFNGLSECONDARYCOLORP3UIPROC sf_glad_glSecondaryColorP3ui; +#define glSecondaryColorP3ui sf_glad_glSecondaryColorP3ui +GLAD_API_CALL PFNGLSECONDARYCOLORP3UIVPROC sf_glad_glSecondaryColorP3uiv; +#define glSecondaryColorP3uiv sf_glad_glSecondaryColorP3uiv +GLAD_API_CALL PFNGLSECONDARYCOLORPOINTERPROC sf_glad_glSecondaryColorPointer; +#define glSecondaryColorPointer sf_glad_glSecondaryColorPointer GLAD_API_CALL PFNGLSELECTBUFFERPROC sf_glad_glSelectBuffer; #define glSelectBuffer sf_glad_glSelectBuffer GLAD_API_CALL PFNGLSEPARABLEFILTER2DPROC sf_glad_glSeparableFilter2D; #define glSeparableFilter2D sf_glad_glSeparableFilter2D GLAD_API_CALL PFNGLSHADEMODELPROC sf_glad_glShadeModel; #define glShadeModel sf_glad_glShadeModel +GLAD_API_CALL PFNGLSHADERBINARYPROC sf_glad_glShaderBinary; +#define glShaderBinary sf_glad_glShaderBinary GLAD_API_CALL PFNGLSHADERSOURCEPROC sf_glad_glShaderSource; #define glShaderSource sf_glad_glShaderSource GLAD_API_CALL PFNGLSHADERSOURCEARBPROC sf_glad_glShaderSourceARB; #define glShaderSourceARB sf_glad_glShaderSourceARB +GLAD_API_CALL PFNGLSHADERSTORAGEBLOCKBINDINGPROC sf_glad_glShaderStorageBlockBinding; +#define glShaderStorageBlockBinding sf_glad_glShaderStorageBlockBinding +GLAD_API_CALL PFNGLSPECIALIZESHADERPROC sf_glad_glSpecializeShader; +#define glSpecializeShader sf_glad_glSpecializeShader GLAD_API_CALL PFNGLSTENCILFUNCPROC sf_glad_glStencilFunc; #define glStencilFunc sf_glad_glStencilFunc +GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC sf_glad_glStencilFuncSeparate; +#define glStencilFuncSeparate sf_glad_glStencilFuncSeparate GLAD_API_CALL PFNGLSTENCILMASKPROC sf_glad_glStencilMask; #define glStencilMask sf_glad_glStencilMask +GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC sf_glad_glStencilMaskSeparate; +#define glStencilMaskSeparate sf_glad_glStencilMaskSeparate GLAD_API_CALL PFNGLSTENCILOPPROC sf_glad_glStencilOp; #define glStencilOp sf_glad_glStencilOp +GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC sf_glad_glStencilOpSeparate; +#define glStencilOpSeparate sf_glad_glStencilOpSeparate +GLAD_API_CALL PFNGLTEXBUFFERPROC sf_glad_glTexBuffer; +#define glTexBuffer sf_glad_glTexBuffer +GLAD_API_CALL PFNGLTEXBUFFERRANGEPROC sf_glad_glTexBufferRange; +#define glTexBufferRange sf_glad_glTexBufferRange GLAD_API_CALL PFNGLTEXCOORD1DPROC sf_glad_glTexCoord1d; #define glTexCoord1d sf_glad_glTexCoord1d GLAD_API_CALL PFNGLTEXCOORD1DVPROC sf_glad_glTexCoord1dv; @@ -4174,6 +6601,22 @@ GLAD_API_CALL PFNGLTEXCOORD4SPROC sf_glad_glTexCoord4s; #define glTexCoord4s sf_glad_glTexCoord4s GLAD_API_CALL PFNGLTEXCOORD4SVPROC sf_glad_glTexCoord4sv; #define glTexCoord4sv sf_glad_glTexCoord4sv +GLAD_API_CALL PFNGLTEXCOORDP1UIPROC sf_glad_glTexCoordP1ui; +#define glTexCoordP1ui sf_glad_glTexCoordP1ui +GLAD_API_CALL PFNGLTEXCOORDP1UIVPROC sf_glad_glTexCoordP1uiv; +#define glTexCoordP1uiv sf_glad_glTexCoordP1uiv +GLAD_API_CALL PFNGLTEXCOORDP2UIPROC sf_glad_glTexCoordP2ui; +#define glTexCoordP2ui sf_glad_glTexCoordP2ui +GLAD_API_CALL PFNGLTEXCOORDP2UIVPROC sf_glad_glTexCoordP2uiv; +#define glTexCoordP2uiv sf_glad_glTexCoordP2uiv +GLAD_API_CALL PFNGLTEXCOORDP3UIPROC sf_glad_glTexCoordP3ui; +#define glTexCoordP3ui sf_glad_glTexCoordP3ui +GLAD_API_CALL PFNGLTEXCOORDP3UIVPROC sf_glad_glTexCoordP3uiv; +#define glTexCoordP3uiv sf_glad_glTexCoordP3uiv +GLAD_API_CALL PFNGLTEXCOORDP4UIPROC sf_glad_glTexCoordP4ui; +#define glTexCoordP4ui sf_glad_glTexCoordP4ui +GLAD_API_CALL PFNGLTEXCOORDP4UIVPROC sf_glad_glTexCoordP4uiv; +#define glTexCoordP4uiv sf_glad_glTexCoordP4uiv GLAD_API_CALL PFNGLTEXCOORDPOINTERPROC sf_glad_glTexCoordPointer; #define glTexCoordPointer sf_glad_glTexCoordPointer GLAD_API_CALL PFNGLTEXCOORDPOINTEREXTPROC sf_glad_glTexCoordPointerEXT; @@ -4202,6 +6645,16 @@ GLAD_API_CALL PFNGLTEXIMAGE1DPROC sf_glad_glTexImage1D; #define glTexImage1D sf_glad_glTexImage1D GLAD_API_CALL PFNGLTEXIMAGE2DPROC sf_glad_glTexImage2D; #define glTexImage2D sf_glad_glTexImage2D +GLAD_API_CALL PFNGLTEXIMAGE2DMULTISAMPLEPROC sf_glad_glTexImage2DMultisample; +#define glTexImage2DMultisample sf_glad_glTexImage2DMultisample +GLAD_API_CALL PFNGLTEXIMAGE3DPROC sf_glad_glTexImage3D; +#define glTexImage3D sf_glad_glTexImage3D +GLAD_API_CALL PFNGLTEXIMAGE3DMULTISAMPLEPROC sf_glad_glTexImage3DMultisample; +#define glTexImage3DMultisample sf_glad_glTexImage3DMultisample +GLAD_API_CALL PFNGLTEXPARAMETERIIVPROC sf_glad_glTexParameterIiv; +#define glTexParameterIiv sf_glad_glTexParameterIiv +GLAD_API_CALL PFNGLTEXPARAMETERIUIVPROC sf_glad_glTexParameterIuiv; +#define glTexParameterIuiv sf_glad_glTexParameterIuiv GLAD_API_CALL PFNGLTEXPARAMETERFPROC sf_glad_glTexParameterf; #define glTexParameterf sf_glad_glTexParameterf GLAD_API_CALL PFNGLTEXPARAMETERFVPROC sf_glad_glTexParameterfv; @@ -4210,6 +6663,16 @@ GLAD_API_CALL PFNGLTEXPARAMETERIPROC sf_glad_glTexParameteri; #define glTexParameteri sf_glad_glTexParameteri GLAD_API_CALL PFNGLTEXPARAMETERIVPROC sf_glad_glTexParameteriv; #define glTexParameteriv sf_glad_glTexParameteriv +GLAD_API_CALL PFNGLTEXSTORAGE1DPROC sf_glad_glTexStorage1D; +#define glTexStorage1D sf_glad_glTexStorage1D +GLAD_API_CALL PFNGLTEXSTORAGE2DPROC sf_glad_glTexStorage2D; +#define glTexStorage2D sf_glad_glTexStorage2D +GLAD_API_CALL PFNGLTEXSTORAGE2DMULTISAMPLEPROC sf_glad_glTexStorage2DMultisample; +#define glTexStorage2DMultisample sf_glad_glTexStorage2DMultisample +GLAD_API_CALL PFNGLTEXSTORAGE3DPROC sf_glad_glTexStorage3D; +#define glTexStorage3D sf_glad_glTexStorage3D +GLAD_API_CALL PFNGLTEXSTORAGE3DMULTISAMPLEPROC sf_glad_glTexStorage3DMultisample; +#define glTexStorage3DMultisample sf_glad_glTexStorage3DMultisample GLAD_API_CALL PFNGLTEXSUBIMAGE1DPROC sf_glad_glTexSubImage1D; #define glTexSubImage1D sf_glad_glTexSubImage1D GLAD_API_CALL PFNGLTEXSUBIMAGE1DEXTPROC sf_glad_glTexSubImage1DEXT; @@ -4218,12 +6681,60 @@ GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC sf_glad_glTexSubImage2D; #define glTexSubImage2D sf_glad_glTexSubImage2D GLAD_API_CALL PFNGLTEXSUBIMAGE2DEXTPROC sf_glad_glTexSubImage2DEXT; #define glTexSubImage2DEXT sf_glad_glTexSubImage2DEXT +GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC sf_glad_glTexSubImage3D; +#define glTexSubImage3D sf_glad_glTexSubImage3D +GLAD_API_CALL PFNGLTEXTUREBARRIERPROC sf_glad_glTextureBarrier; +#define glTextureBarrier sf_glad_glTextureBarrier +GLAD_API_CALL PFNGLTEXTUREBUFFERPROC sf_glad_glTextureBuffer; +#define glTextureBuffer sf_glad_glTextureBuffer +GLAD_API_CALL PFNGLTEXTUREBUFFERRANGEPROC sf_glad_glTextureBufferRange; +#define glTextureBufferRange sf_glad_glTextureBufferRange +GLAD_API_CALL PFNGLTEXTUREPARAMETERIIVPROC sf_glad_glTextureParameterIiv; +#define glTextureParameterIiv sf_glad_glTextureParameterIiv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIUIVPROC sf_glad_glTextureParameterIuiv; +#define glTextureParameterIuiv sf_glad_glTextureParameterIuiv +GLAD_API_CALL PFNGLTEXTUREPARAMETERFPROC sf_glad_glTextureParameterf; +#define glTextureParameterf sf_glad_glTextureParameterf +GLAD_API_CALL PFNGLTEXTUREPARAMETERFVPROC sf_glad_glTextureParameterfv; +#define glTextureParameterfv sf_glad_glTextureParameterfv +GLAD_API_CALL PFNGLTEXTUREPARAMETERIPROC sf_glad_glTextureParameteri; +#define glTextureParameteri sf_glad_glTextureParameteri +GLAD_API_CALL PFNGLTEXTUREPARAMETERIVPROC sf_glad_glTextureParameteriv; +#define glTextureParameteriv sf_glad_glTextureParameteriv +GLAD_API_CALL PFNGLTEXTURESTORAGE1DPROC sf_glad_glTextureStorage1D; +#define glTextureStorage1D sf_glad_glTextureStorage1D +GLAD_API_CALL PFNGLTEXTURESTORAGE2DPROC sf_glad_glTextureStorage2D; +#define glTextureStorage2D sf_glad_glTextureStorage2D +GLAD_API_CALL PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC sf_glad_glTextureStorage2DMultisample; +#define glTextureStorage2DMultisample sf_glad_glTextureStorage2DMultisample +GLAD_API_CALL PFNGLTEXTURESTORAGE3DPROC sf_glad_glTextureStorage3D; +#define glTextureStorage3D sf_glad_glTextureStorage3D +GLAD_API_CALL PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC sf_glad_glTextureStorage3DMultisample; +#define glTextureStorage3DMultisample sf_glad_glTextureStorage3DMultisample +GLAD_API_CALL PFNGLTEXTURESUBIMAGE1DPROC sf_glad_glTextureSubImage1D; +#define glTextureSubImage1D sf_glad_glTextureSubImage1D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE2DPROC sf_glad_glTextureSubImage2D; +#define glTextureSubImage2D sf_glad_glTextureSubImage2D +GLAD_API_CALL PFNGLTEXTURESUBIMAGE3DPROC sf_glad_glTextureSubImage3D; +#define glTextureSubImage3D sf_glad_glTextureSubImage3D +GLAD_API_CALL PFNGLTEXTUREVIEWPROC sf_glad_glTextureView; +#define glTextureView sf_glad_glTextureView GLAD_API_CALL PFNGLTRACKMATRIXNVPROC sf_glad_glTrackMatrixNV; #define glTrackMatrixNV sf_glad_glTrackMatrixNV +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC sf_glad_glTransformFeedbackBufferBase; +#define glTransformFeedbackBufferBase sf_glad_glTransformFeedbackBufferBase +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC sf_glad_glTransformFeedbackBufferRange; +#define glTransformFeedbackBufferRange sf_glad_glTransformFeedbackBufferRange +GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC sf_glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings sf_glad_glTransformFeedbackVaryings GLAD_API_CALL PFNGLTRANSLATEDPROC sf_glad_glTranslated; #define glTranslated sf_glad_glTranslated GLAD_API_CALL PFNGLTRANSLATEFPROC sf_glad_glTranslatef; #define glTranslatef sf_glad_glTranslatef +GLAD_API_CALL PFNGLUNIFORM1DPROC sf_glad_glUniform1d; +#define glUniform1d sf_glad_glUniform1d +GLAD_API_CALL PFNGLUNIFORM1DVPROC sf_glad_glUniform1dv; +#define glUniform1dv sf_glad_glUniform1dv GLAD_API_CALL PFNGLUNIFORM1FPROC sf_glad_glUniform1f; #define glUniform1f sf_glad_glUniform1f GLAD_API_CALL PFNGLUNIFORM1FARBPROC sf_glad_glUniform1fARB; @@ -4240,6 +6751,14 @@ GLAD_API_CALL PFNGLUNIFORM1IVPROC sf_glad_glUniform1iv; #define glUniform1iv sf_glad_glUniform1iv GLAD_API_CALL PFNGLUNIFORM1IVARBPROC sf_glad_glUniform1ivARB; #define glUniform1ivARB sf_glad_glUniform1ivARB +GLAD_API_CALL PFNGLUNIFORM1UIPROC sf_glad_glUniform1ui; +#define glUniform1ui sf_glad_glUniform1ui +GLAD_API_CALL PFNGLUNIFORM1UIVPROC sf_glad_glUniform1uiv; +#define glUniform1uiv sf_glad_glUniform1uiv +GLAD_API_CALL PFNGLUNIFORM2DPROC sf_glad_glUniform2d; +#define glUniform2d sf_glad_glUniform2d +GLAD_API_CALL PFNGLUNIFORM2DVPROC sf_glad_glUniform2dv; +#define glUniform2dv sf_glad_glUniform2dv GLAD_API_CALL PFNGLUNIFORM2FPROC sf_glad_glUniform2f; #define glUniform2f sf_glad_glUniform2f GLAD_API_CALL PFNGLUNIFORM2FARBPROC sf_glad_glUniform2fARB; @@ -4256,6 +6775,14 @@ GLAD_API_CALL PFNGLUNIFORM2IVPROC sf_glad_glUniform2iv; #define glUniform2iv sf_glad_glUniform2iv GLAD_API_CALL PFNGLUNIFORM2IVARBPROC sf_glad_glUniform2ivARB; #define glUniform2ivARB sf_glad_glUniform2ivARB +GLAD_API_CALL PFNGLUNIFORM2UIPROC sf_glad_glUniform2ui; +#define glUniform2ui sf_glad_glUniform2ui +GLAD_API_CALL PFNGLUNIFORM2UIVPROC sf_glad_glUniform2uiv; +#define glUniform2uiv sf_glad_glUniform2uiv +GLAD_API_CALL PFNGLUNIFORM3DPROC sf_glad_glUniform3d; +#define glUniform3d sf_glad_glUniform3d +GLAD_API_CALL PFNGLUNIFORM3DVPROC sf_glad_glUniform3dv; +#define glUniform3dv sf_glad_glUniform3dv GLAD_API_CALL PFNGLUNIFORM3FPROC sf_glad_glUniform3f; #define glUniform3f sf_glad_glUniform3f GLAD_API_CALL PFNGLUNIFORM3FARBPROC sf_glad_glUniform3fARB; @@ -4272,6 +6799,14 @@ GLAD_API_CALL PFNGLUNIFORM3IVPROC sf_glad_glUniform3iv; #define glUniform3iv sf_glad_glUniform3iv GLAD_API_CALL PFNGLUNIFORM3IVARBPROC sf_glad_glUniform3ivARB; #define glUniform3ivARB sf_glad_glUniform3ivARB +GLAD_API_CALL PFNGLUNIFORM3UIPROC sf_glad_glUniform3ui; +#define glUniform3ui sf_glad_glUniform3ui +GLAD_API_CALL PFNGLUNIFORM3UIVPROC sf_glad_glUniform3uiv; +#define glUniform3uiv sf_glad_glUniform3uiv +GLAD_API_CALL PFNGLUNIFORM4DPROC sf_glad_glUniform4d; +#define glUniform4d sf_glad_glUniform4d +GLAD_API_CALL PFNGLUNIFORM4DVPROC sf_glad_glUniform4dv; +#define glUniform4dv sf_glad_glUniform4dv GLAD_API_CALL PFNGLUNIFORM4FPROC sf_glad_glUniform4f; #define glUniform4f sf_glad_glUniform4f GLAD_API_CALL PFNGLUNIFORM4FARBPROC sf_glad_glUniform4fARB; @@ -4288,22 +6823,62 @@ GLAD_API_CALL PFNGLUNIFORM4IVPROC sf_glad_glUniform4iv; #define glUniform4iv sf_glad_glUniform4iv GLAD_API_CALL PFNGLUNIFORM4IVARBPROC sf_glad_glUniform4ivARB; #define glUniform4ivARB sf_glad_glUniform4ivARB +GLAD_API_CALL PFNGLUNIFORM4UIPROC sf_glad_glUniform4ui; +#define glUniform4ui sf_glad_glUniform4ui +GLAD_API_CALL PFNGLUNIFORM4UIVPROC sf_glad_glUniform4uiv; +#define glUniform4uiv sf_glad_glUniform4uiv +GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC sf_glad_glUniformBlockBinding; +#define glUniformBlockBinding sf_glad_glUniformBlockBinding +GLAD_API_CALL PFNGLUNIFORMMATRIX2DVPROC sf_glad_glUniformMatrix2dv; +#define glUniformMatrix2dv sf_glad_glUniformMatrix2dv GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC sf_glad_glUniformMatrix2fv; #define glUniformMatrix2fv sf_glad_glUniformMatrix2fv GLAD_API_CALL PFNGLUNIFORMMATRIX2FVARBPROC sf_glad_glUniformMatrix2fvARB; #define glUniformMatrix2fvARB sf_glad_glUniformMatrix2fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3DVPROC sf_glad_glUniformMatrix2x3dv; +#define glUniformMatrix2x3dv sf_glad_glUniformMatrix2x3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC sf_glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv sf_glad_glUniformMatrix2x3fv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4DVPROC sf_glad_glUniformMatrix2x4dv; +#define glUniformMatrix2x4dv sf_glad_glUniformMatrix2x4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC sf_glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv sf_glad_glUniformMatrix2x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3DVPROC sf_glad_glUniformMatrix3dv; +#define glUniformMatrix3dv sf_glad_glUniformMatrix3dv GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC sf_glad_glUniformMatrix3fv; #define glUniformMatrix3fv sf_glad_glUniformMatrix3fv GLAD_API_CALL PFNGLUNIFORMMATRIX3FVARBPROC sf_glad_glUniformMatrix3fvARB; #define glUniformMatrix3fvARB sf_glad_glUniformMatrix3fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2DVPROC sf_glad_glUniformMatrix3x2dv; +#define glUniformMatrix3x2dv sf_glad_glUniformMatrix3x2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC sf_glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv sf_glad_glUniformMatrix3x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4DVPROC sf_glad_glUniformMatrix3x4dv; +#define glUniformMatrix3x4dv sf_glad_glUniformMatrix3x4dv +GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC sf_glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv sf_glad_glUniformMatrix3x4fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4DVPROC sf_glad_glUniformMatrix4dv; +#define glUniformMatrix4dv sf_glad_glUniformMatrix4dv GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC sf_glad_glUniformMatrix4fv; #define glUniformMatrix4fv sf_glad_glUniformMatrix4fv GLAD_API_CALL PFNGLUNIFORMMATRIX4FVARBPROC sf_glad_glUniformMatrix4fvARB; #define glUniformMatrix4fvARB sf_glad_glUniformMatrix4fvARB +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2DVPROC sf_glad_glUniformMatrix4x2dv; +#define glUniformMatrix4x2dv sf_glad_glUniformMatrix4x2dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC sf_glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv sf_glad_glUniformMatrix4x2fv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3DVPROC sf_glad_glUniformMatrix4x3dv; +#define glUniformMatrix4x3dv sf_glad_glUniformMatrix4x3dv +GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC sf_glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv sf_glad_glUniformMatrix4x3fv +GLAD_API_CALL PFNGLUNIFORMSUBROUTINESUIVPROC sf_glad_glUniformSubroutinesuiv; +#define glUniformSubroutinesuiv sf_glad_glUniformSubroutinesuiv GLAD_API_CALL PFNGLUNMAPBUFFERPROC sf_glad_glUnmapBuffer; #define glUnmapBuffer sf_glad_glUnmapBuffer GLAD_API_CALL PFNGLUNMAPBUFFERARBPROC sf_glad_glUnmapBufferARB; #define glUnmapBufferARB sf_glad_glUnmapBufferARB +GLAD_API_CALL PFNGLUNMAPNAMEDBUFFERPROC sf_glad_glUnmapNamedBuffer; +#define glUnmapNamedBuffer sf_glad_glUnmapNamedBuffer GLAD_API_CALL PFNGLUSEPROGRAMPROC sf_glad_glUseProgram; #define glUseProgram sf_glad_glUseProgram GLAD_API_CALL PFNGLUSEPROGRAMOBJECTARBPROC sf_glad_glUseProgramObjectARB; @@ -4364,6 +6939,22 @@ GLAD_API_CALL PFNGLVERTEX4SPROC sf_glad_glVertex4s; #define glVertex4s sf_glad_glVertex4s GLAD_API_CALL PFNGLVERTEX4SVPROC sf_glad_glVertex4sv; #define glVertex4sv sf_glad_glVertex4sv +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBBINDINGPROC sf_glad_glVertexArrayAttribBinding; +#define glVertexArrayAttribBinding sf_glad_glVertexArrayAttribBinding +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBFORMATPROC sf_glad_glVertexArrayAttribFormat; +#define glVertexArrayAttribFormat sf_glad_glVertexArrayAttribFormat +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBIFORMATPROC sf_glad_glVertexArrayAttribIFormat; +#define glVertexArrayAttribIFormat sf_glad_glVertexArrayAttribIFormat +GLAD_API_CALL PFNGLVERTEXARRAYATTRIBLFORMATPROC sf_glad_glVertexArrayAttribLFormat; +#define glVertexArrayAttribLFormat sf_glad_glVertexArrayAttribLFormat +GLAD_API_CALL PFNGLVERTEXARRAYBINDINGDIVISORPROC sf_glad_glVertexArrayBindingDivisor; +#define glVertexArrayBindingDivisor sf_glad_glVertexArrayBindingDivisor +GLAD_API_CALL PFNGLVERTEXARRAYELEMENTBUFFERPROC sf_glad_glVertexArrayElementBuffer; +#define glVertexArrayElementBuffer sf_glad_glVertexArrayElementBuffer +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERPROC sf_glad_glVertexArrayVertexBuffer; +#define glVertexArrayVertexBuffer sf_glad_glVertexArrayVertexBuffer +GLAD_API_CALL PFNGLVERTEXARRAYVERTEXBUFFERSPROC sf_glad_glVertexArrayVertexBuffers; +#define glVertexArrayVertexBuffers sf_glad_glVertexArrayVertexBuffers GLAD_API_CALL PFNGLVERTEXATTRIB1DPROC sf_glad_glVertexAttrib1d; #define glVertexAttrib1d sf_glad_glVertexAttrib1d GLAD_API_CALL PFNGLVERTEXATTRIB1DARBPROC sf_glad_glVertexAttrib1dARB; @@ -4560,6 +7151,92 @@ GLAD_API_CALL PFNGLVERTEXATTRIB4USVPROC sf_glad_glVertexAttrib4usv; #define glVertexAttrib4usv sf_glad_glVertexAttrib4usv GLAD_API_CALL PFNGLVERTEXATTRIB4USVARBPROC sf_glad_glVertexAttrib4usvARB; #define glVertexAttrib4usvARB sf_glad_glVertexAttrib4usvARB +GLAD_API_CALL PFNGLVERTEXATTRIBBINDINGPROC sf_glad_glVertexAttribBinding; +#define glVertexAttribBinding sf_glad_glVertexAttribBinding +GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC sf_glad_glVertexAttribDivisor; +#define glVertexAttribDivisor sf_glad_glVertexAttribDivisor +GLAD_API_CALL PFNGLVERTEXATTRIBFORMATPROC sf_glad_glVertexAttribFormat; +#define glVertexAttribFormat sf_glad_glVertexAttribFormat +GLAD_API_CALL PFNGLVERTEXATTRIBI1IPROC sf_glad_glVertexAttribI1i; +#define glVertexAttribI1i sf_glad_glVertexAttribI1i +GLAD_API_CALL PFNGLVERTEXATTRIBI1IVPROC sf_glad_glVertexAttribI1iv; +#define glVertexAttribI1iv sf_glad_glVertexAttribI1iv +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIPROC sf_glad_glVertexAttribI1ui; +#define glVertexAttribI1ui sf_glad_glVertexAttribI1ui +GLAD_API_CALL PFNGLVERTEXATTRIBI1UIVPROC sf_glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv sf_glad_glVertexAttribI1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI2IPROC sf_glad_glVertexAttribI2i; +#define glVertexAttribI2i sf_glad_glVertexAttribI2i +GLAD_API_CALL PFNGLVERTEXATTRIBI2IVPROC sf_glad_glVertexAttribI2iv; +#define glVertexAttribI2iv sf_glad_glVertexAttribI2iv +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIPROC sf_glad_glVertexAttribI2ui; +#define glVertexAttribI2ui sf_glad_glVertexAttribI2ui +GLAD_API_CALL PFNGLVERTEXATTRIBI2UIVPROC sf_glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv sf_glad_glVertexAttribI2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI3IPROC sf_glad_glVertexAttribI3i; +#define glVertexAttribI3i sf_glad_glVertexAttribI3i +GLAD_API_CALL PFNGLVERTEXATTRIBI3IVPROC sf_glad_glVertexAttribI3iv; +#define glVertexAttribI3iv sf_glad_glVertexAttribI3iv +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIPROC sf_glad_glVertexAttribI3ui; +#define glVertexAttribI3ui sf_glad_glVertexAttribI3ui +GLAD_API_CALL PFNGLVERTEXATTRIBI3UIVPROC sf_glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv sf_glad_glVertexAttribI3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4BVPROC sf_glad_glVertexAttribI4bv; +#define glVertexAttribI4bv sf_glad_glVertexAttribI4bv +GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC sf_glad_glVertexAttribI4i; +#define glVertexAttribI4i sf_glad_glVertexAttribI4i +GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC sf_glad_glVertexAttribI4iv; +#define glVertexAttribI4iv sf_glad_glVertexAttribI4iv +GLAD_API_CALL PFNGLVERTEXATTRIBI4SVPROC sf_glad_glVertexAttribI4sv; +#define glVertexAttribI4sv sf_glad_glVertexAttribI4sv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UBVPROC sf_glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv sf_glad_glVertexAttribI4ubv +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC sf_glad_glVertexAttribI4ui; +#define glVertexAttribI4ui sf_glad_glVertexAttribI4ui +GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC sf_glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv sf_glad_glVertexAttribI4uiv +GLAD_API_CALL PFNGLVERTEXATTRIBI4USVPROC sf_glad_glVertexAttribI4usv; +#define glVertexAttribI4usv sf_glad_glVertexAttribI4usv +GLAD_API_CALL PFNGLVERTEXATTRIBIFORMATPROC sf_glad_glVertexAttribIFormat; +#define glVertexAttribIFormat sf_glad_glVertexAttribIFormat +GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC sf_glad_glVertexAttribIPointer; +#define glVertexAttribIPointer sf_glad_glVertexAttribIPointer +GLAD_API_CALL PFNGLVERTEXATTRIBL1DPROC sf_glad_glVertexAttribL1d; +#define glVertexAttribL1d sf_glad_glVertexAttribL1d +GLAD_API_CALL PFNGLVERTEXATTRIBL1DVPROC sf_glad_glVertexAttribL1dv; +#define glVertexAttribL1dv sf_glad_glVertexAttribL1dv +GLAD_API_CALL PFNGLVERTEXATTRIBL2DPROC sf_glad_glVertexAttribL2d; +#define glVertexAttribL2d sf_glad_glVertexAttribL2d +GLAD_API_CALL PFNGLVERTEXATTRIBL2DVPROC sf_glad_glVertexAttribL2dv; +#define glVertexAttribL2dv sf_glad_glVertexAttribL2dv +GLAD_API_CALL PFNGLVERTEXATTRIBL3DPROC sf_glad_glVertexAttribL3d; +#define glVertexAttribL3d sf_glad_glVertexAttribL3d +GLAD_API_CALL PFNGLVERTEXATTRIBL3DVPROC sf_glad_glVertexAttribL3dv; +#define glVertexAttribL3dv sf_glad_glVertexAttribL3dv +GLAD_API_CALL PFNGLVERTEXATTRIBL4DPROC sf_glad_glVertexAttribL4d; +#define glVertexAttribL4d sf_glad_glVertexAttribL4d +GLAD_API_CALL PFNGLVERTEXATTRIBL4DVPROC sf_glad_glVertexAttribL4dv; +#define glVertexAttribL4dv sf_glad_glVertexAttribL4dv +GLAD_API_CALL PFNGLVERTEXATTRIBLFORMATPROC sf_glad_glVertexAttribLFormat; +#define glVertexAttribLFormat sf_glad_glVertexAttribLFormat +GLAD_API_CALL PFNGLVERTEXATTRIBLPOINTERPROC sf_glad_glVertexAttribLPointer; +#define glVertexAttribLPointer sf_glad_glVertexAttribLPointer +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIPROC sf_glad_glVertexAttribP1ui; +#define glVertexAttribP1ui sf_glad_glVertexAttribP1ui +GLAD_API_CALL PFNGLVERTEXATTRIBP1UIVPROC sf_glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv sf_glad_glVertexAttribP1uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIPROC sf_glad_glVertexAttribP2ui; +#define glVertexAttribP2ui sf_glad_glVertexAttribP2ui +GLAD_API_CALL PFNGLVERTEXATTRIBP2UIVPROC sf_glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv sf_glad_glVertexAttribP2uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIPROC sf_glad_glVertexAttribP3ui; +#define glVertexAttribP3ui sf_glad_glVertexAttribP3ui +GLAD_API_CALL PFNGLVERTEXATTRIBP3UIVPROC sf_glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv sf_glad_glVertexAttribP3uiv +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIPROC sf_glad_glVertexAttribP4ui; +#define glVertexAttribP4ui sf_glad_glVertexAttribP4ui +GLAD_API_CALL PFNGLVERTEXATTRIBP4UIVPROC sf_glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv sf_glad_glVertexAttribP4uiv GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC sf_glad_glVertexAttribPointer; #define glVertexAttribPointer sf_glad_glVertexAttribPointer GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERARBPROC sf_glad_glVertexAttribPointerARB; @@ -4592,12 +7269,66 @@ GLAD_API_CALL PFNGLVERTEXATTRIBS4SVNVPROC sf_glad_glVertexAttribs4svNV; #define glVertexAttribs4svNV sf_glad_glVertexAttribs4svNV GLAD_API_CALL PFNGLVERTEXATTRIBS4UBVNVPROC sf_glad_glVertexAttribs4ubvNV; #define glVertexAttribs4ubvNV sf_glad_glVertexAttribs4ubvNV +GLAD_API_CALL PFNGLVERTEXBINDINGDIVISORPROC sf_glad_glVertexBindingDivisor; +#define glVertexBindingDivisor sf_glad_glVertexBindingDivisor +GLAD_API_CALL PFNGLVERTEXP2UIPROC sf_glad_glVertexP2ui; +#define glVertexP2ui sf_glad_glVertexP2ui +GLAD_API_CALL PFNGLVERTEXP2UIVPROC sf_glad_glVertexP2uiv; +#define glVertexP2uiv sf_glad_glVertexP2uiv +GLAD_API_CALL PFNGLVERTEXP3UIPROC sf_glad_glVertexP3ui; +#define glVertexP3ui sf_glad_glVertexP3ui +GLAD_API_CALL PFNGLVERTEXP3UIVPROC sf_glad_glVertexP3uiv; +#define glVertexP3uiv sf_glad_glVertexP3uiv +GLAD_API_CALL PFNGLVERTEXP4UIPROC sf_glad_glVertexP4ui; +#define glVertexP4ui sf_glad_glVertexP4ui +GLAD_API_CALL PFNGLVERTEXP4UIVPROC sf_glad_glVertexP4uiv; +#define glVertexP4uiv sf_glad_glVertexP4uiv GLAD_API_CALL PFNGLVERTEXPOINTERPROC sf_glad_glVertexPointer; #define glVertexPointer sf_glad_glVertexPointer GLAD_API_CALL PFNGLVERTEXPOINTEREXTPROC sf_glad_glVertexPointerEXT; #define glVertexPointerEXT sf_glad_glVertexPointerEXT GLAD_API_CALL PFNGLVIEWPORTPROC sf_glad_glViewport; #define glViewport sf_glad_glViewport +GLAD_API_CALL PFNGLVIEWPORTARRAYVPROC sf_glad_glViewportArrayv; +#define glViewportArrayv sf_glad_glViewportArrayv +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFPROC sf_glad_glViewportIndexedf; +#define glViewportIndexedf sf_glad_glViewportIndexedf +GLAD_API_CALL PFNGLVIEWPORTINDEXEDFVPROC sf_glad_glViewportIndexedfv; +#define glViewportIndexedfv sf_glad_glViewportIndexedfv +GLAD_API_CALL PFNGLWAITSYNCPROC sf_glad_glWaitSync; +#define glWaitSync sf_glad_glWaitSync +GLAD_API_CALL PFNGLWINDOWPOS2DPROC sf_glad_glWindowPos2d; +#define glWindowPos2d sf_glad_glWindowPos2d +GLAD_API_CALL PFNGLWINDOWPOS2DVPROC sf_glad_glWindowPos2dv; +#define glWindowPos2dv sf_glad_glWindowPos2dv +GLAD_API_CALL PFNGLWINDOWPOS2FPROC sf_glad_glWindowPos2f; +#define glWindowPos2f sf_glad_glWindowPos2f +GLAD_API_CALL PFNGLWINDOWPOS2FVPROC sf_glad_glWindowPos2fv; +#define glWindowPos2fv sf_glad_glWindowPos2fv +GLAD_API_CALL PFNGLWINDOWPOS2IPROC sf_glad_glWindowPos2i; +#define glWindowPos2i sf_glad_glWindowPos2i +GLAD_API_CALL PFNGLWINDOWPOS2IVPROC sf_glad_glWindowPos2iv; +#define glWindowPos2iv sf_glad_glWindowPos2iv +GLAD_API_CALL PFNGLWINDOWPOS2SPROC sf_glad_glWindowPos2s; +#define glWindowPos2s sf_glad_glWindowPos2s +GLAD_API_CALL PFNGLWINDOWPOS2SVPROC sf_glad_glWindowPos2sv; +#define glWindowPos2sv sf_glad_glWindowPos2sv +GLAD_API_CALL PFNGLWINDOWPOS3DPROC sf_glad_glWindowPos3d; +#define glWindowPos3d sf_glad_glWindowPos3d +GLAD_API_CALL PFNGLWINDOWPOS3DVPROC sf_glad_glWindowPos3dv; +#define glWindowPos3dv sf_glad_glWindowPos3dv +GLAD_API_CALL PFNGLWINDOWPOS3FPROC sf_glad_glWindowPos3f; +#define glWindowPos3f sf_glad_glWindowPos3f +GLAD_API_CALL PFNGLWINDOWPOS3FVPROC sf_glad_glWindowPos3fv; +#define glWindowPos3fv sf_glad_glWindowPos3fv +GLAD_API_CALL PFNGLWINDOWPOS3IPROC sf_glad_glWindowPos3i; +#define glWindowPos3i sf_glad_glWindowPos3i +GLAD_API_CALL PFNGLWINDOWPOS3IVPROC sf_glad_glWindowPos3iv; +#define glWindowPos3iv sf_glad_glWindowPos3iv +GLAD_API_CALL PFNGLWINDOWPOS3SPROC sf_glad_glWindowPos3s; +#define glWindowPos3s sf_glad_glWindowPos3s +GLAD_API_CALL PFNGLWINDOWPOS3SVPROC sf_glad_glWindowPos3sv; +#define glWindowPos3sv sf_glad_glWindowPos3sv GLAD_API_CALL PFNGLALPHAFUNCXPROC sf_glad_glAlphaFuncx; #define glAlphaFuncx sf_glad_glAlphaFuncx GLAD_API_CALL PFNGLBINDFRAMEBUFFEROESPROC sf_glad_glBindFramebufferOES; @@ -4614,32 +7345,18 @@ GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSOESPROC sf_glad_glCheckFramebufferStatu #define glCheckFramebufferStatusOES sf_glad_glCheckFramebufferStatusOES GLAD_API_CALL PFNGLCLEARCOLORXPROC sf_glad_glClearColorx; #define glClearColorx sf_glad_glClearColorx -GLAD_API_CALL PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf; -#define glClearDepthf sf_glad_glClearDepthf -GLAD_API_CALL PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES; -#define glClearDepthfOES sf_glad_glClearDepthfOES GLAD_API_CALL PFNGLCLEARDEPTHXPROC sf_glad_glClearDepthx; #define glClearDepthx sf_glad_glClearDepthx GLAD_API_CALL PFNGLCLIPPLANEFPROC sf_glad_glClipPlanef; #define glClipPlanef sf_glad_glClipPlanef -GLAD_API_CALL PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES; -#define glClipPlanefOES sf_glad_glClipPlanefOES GLAD_API_CALL PFNGLCLIPPLANEXPROC sf_glad_glClipPlanex; #define glClipPlanex sf_glad_glClipPlanex GLAD_API_CALL PFNGLCOLOR4XPROC sf_glad_glColor4x; #define glColor4x sf_glad_glColor4x -GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D; -#define glCompressedTexImage2D sf_glad_glCompressedTexImage2D -GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D; -#define glCompressedTexSubImage2D sf_glad_glCompressedTexSubImage2D GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSOESPROC sf_glad_glDeleteFramebuffersOES; #define glDeleteFramebuffersOES sf_glad_glDeleteFramebuffersOES GLAD_API_CALL PFNGLDELETERENDERBUFFERSOESPROC sf_glad_glDeleteRenderbuffersOES; #define glDeleteRenderbuffersOES sf_glad_glDeleteRenderbuffersOES -GLAD_API_CALL PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef; -#define glDepthRangef sf_glad_glDepthRangef -GLAD_API_CALL PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES; -#define glDepthRangefOES sf_glad_glDepthRangefOES GLAD_API_CALL PFNGLDEPTHRANGEXPROC sf_glad_glDepthRangex; #define glDepthRangex sf_glad_glDepthRangex GLAD_API_CALL PFNGLFOGXPROC sf_glad_glFogx; @@ -4652,8 +7369,6 @@ GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DOESPROC sf_glad_glFramebufferTexture2DOES #define glFramebufferTexture2DOES sf_glad_glFramebufferTexture2DOES GLAD_API_CALL PFNGLFRUSTUMFPROC sf_glad_glFrustumf; #define glFrustumf sf_glad_glFrustumf -GLAD_API_CALL PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES; -#define glFrustumfOES sf_glad_glFrustumfOES GLAD_API_CALL PFNGLFRUSTUMXPROC sf_glad_glFrustumx; #define glFrustumx sf_glad_glFrustumx GLAD_API_CALL PFNGLGENFRAMEBUFFERSOESPROC sf_glad_glGenFramebuffersOES; @@ -4664,8 +7379,6 @@ GLAD_API_CALL PFNGLGENERATEMIPMAPOESPROC sf_glad_glGenerateMipmapOES; #define glGenerateMipmapOES sf_glad_glGenerateMipmapOES GLAD_API_CALL PFNGLGETCLIPPLANEFPROC sf_glad_glGetClipPlanef; #define glGetClipPlanef sf_glad_glGetClipPlanef -GLAD_API_CALL PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES; -#define glGetClipPlanefOES sf_glad_glGetClipPlanefOES GLAD_API_CALL PFNGLGETCLIPPLANEXPROC sf_glad_glGetClipPlanex; #define glGetClipPlanex sf_glad_glGetClipPlanex GLAD_API_CALL PFNGLGETFIXEDVPROC sf_glad_glGetFixedv; @@ -4710,14 +7423,8 @@ GLAD_API_CALL PFNGLNORMAL3XPROC sf_glad_glNormal3x; #define glNormal3x sf_glad_glNormal3x GLAD_API_CALL PFNGLORTHOFPROC sf_glad_glOrthof; #define glOrthof sf_glad_glOrthof -GLAD_API_CALL PFNGLORTHOFOESPROC sf_glad_glOrthofOES; -#define glOrthofOES sf_glad_glOrthofOES GLAD_API_CALL PFNGLORTHOXPROC sf_glad_glOrthox; #define glOrthox sf_glad_glOrthox -GLAD_API_CALL PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf; -#define glPointParameterf sf_glad_glPointParameterf -GLAD_API_CALL PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv; -#define glPointParameterfv sf_glad_glPointParameterfv GLAD_API_CALL PFNGLPOINTPARAMETERXPROC sf_glad_glPointParameterx; #define glPointParameterx sf_glad_glPointParameterx GLAD_API_CALL PFNGLPOINTPARAMETERXVPROC sf_glad_glPointParameterxv; @@ -4730,8 +7437,6 @@ GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEOESPROC sf_glad_glRenderbufferStorageOES; #define glRenderbufferStorageOES sf_glad_glRenderbufferStorageOES GLAD_API_CALL PFNGLROTATEXPROC sf_glad_glRotatex; #define glRotatex sf_glad_glRotatex -GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage; -#define glSampleCoverage sf_glad_glSampleCoverage GLAD_API_CALL PFNGLSAMPLECOVERAGEXPROC sf_glad_glSampleCoveragex; #define glSampleCoveragex sf_glad_glSampleCoveragex GLAD_API_CALL PFNGLSCALEXPROC sf_glad_glScalex; @@ -4773,24 +7478,95 @@ GLAD_API_CALL PFNGLTRANSLATEXPROC sf_glad_glTranslatex; #endif /* GLAD_IMPL_UTIL_C_ */ +#ifdef __cplusplus +extern "C" { +#endif + + int SF_GLAD_GL_VERSION_1_0 = 0; int SF_GLAD_GL_VERSION_1_1 = 0; +int SF_GLAD_GL_VERSION_1_2 = 0; +int SF_GLAD_GL_VERSION_1_3 = 0; +int SF_GLAD_GL_VERSION_1_4 = 0; +int SF_GLAD_GL_VERSION_1_5 = 0; +int SF_GLAD_GL_VERSION_2_0 = 0; +int SF_GLAD_GL_VERSION_2_1 = 0; +int SF_GLAD_GL_VERSION_3_0 = 0; +int SF_GLAD_GL_VERSION_3_1 = 0; +int SF_GLAD_GL_VERSION_3_2 = 0; +int SF_GLAD_GL_VERSION_3_3 = 0; +int SF_GLAD_GL_VERSION_4_0 = 0; +int SF_GLAD_GL_VERSION_4_1 = 0; +int SF_GLAD_GL_VERSION_4_2 = 0; +int SF_GLAD_GL_VERSION_4_3 = 0; +int SF_GLAD_GL_VERSION_4_4 = 0; +int SF_GLAD_GL_VERSION_4_5 = 0; +int SF_GLAD_GL_VERSION_4_6 = 0; int SF_GLAD_GL_VERSION_ES_CM_1_0 = 0; +int SF_GLAD_GL_ARB_ES2_compatibility = 0; +int SF_GLAD_GL_ARB_ES3_1_compatibility = 0; +int SF_GLAD_GL_ARB_base_instance = 0; +int SF_GLAD_GL_ARB_blend_func_extended = 0; +int SF_GLAD_GL_ARB_buffer_storage = 0; +int SF_GLAD_GL_ARB_clear_buffer_object = 0; +int SF_GLAD_GL_ARB_clear_texture = 0; +int SF_GLAD_GL_ARB_clip_control = 0; +int SF_GLAD_GL_ARB_compute_shader = 0; int SF_GLAD_GL_ARB_copy_buffer = 0; +int SF_GLAD_GL_ARB_copy_image = 0; +int SF_GLAD_GL_ARB_direct_state_access = 0; +int SF_GLAD_GL_ARB_draw_elements_base_vertex = 0; +int SF_GLAD_GL_ARB_draw_indirect = 0; +int SF_GLAD_GL_ARB_fragment_program = 0; int SF_GLAD_GL_ARB_fragment_shader = 0; +int SF_GLAD_GL_ARB_framebuffer_no_attachments = 0; int SF_GLAD_GL_ARB_framebuffer_object = 0; int SF_GLAD_GL_ARB_geometry_shader4 = 0; int SF_GLAD_GL_ARB_get_program_binary = 0; +int SF_GLAD_GL_ARB_get_texture_sub_image = 0; +int SF_GLAD_GL_ARB_gpu_shader_fp64 = 0; int SF_GLAD_GL_ARB_imaging = 0; +int SF_GLAD_GL_ARB_internalformat_query = 0; +int SF_GLAD_GL_ARB_internalformat_query2 = 0; +int SF_GLAD_GL_ARB_invalidate_subdata = 0; +int SF_GLAD_GL_ARB_map_buffer_range = 0; +int SF_GLAD_GL_ARB_multi_bind = 0; +int SF_GLAD_GL_ARB_multi_draw_indirect = 0; int SF_GLAD_GL_ARB_multitexture = 0; +int SF_GLAD_GL_ARB_polygon_offset_clamp = 0; +int SF_GLAD_GL_ARB_program_interface_query = 0; +int SF_GLAD_GL_ARB_provoking_vertex = 0; +int SF_GLAD_GL_ARB_sampler_objects = 0; int SF_GLAD_GL_ARB_separate_shader_objects = 0; +int SF_GLAD_GL_ARB_shader_atomic_counters = 0; +int SF_GLAD_GL_ARB_shader_image_load_store = 0; int SF_GLAD_GL_ARB_shader_objects = 0; +int SF_GLAD_GL_ARB_shader_storage_buffer_object = 0; +int SF_GLAD_GL_ARB_shader_subroutine = 0; int SF_GLAD_GL_ARB_shading_language_100 = 0; +int SF_GLAD_GL_ARB_sync = 0; +int SF_GLAD_GL_ARB_tessellation_shader = 0; +int SF_GLAD_GL_ARB_texture_barrier = 0; +int SF_GLAD_GL_ARB_texture_buffer_range = 0; +int SF_GLAD_GL_ARB_texture_multisample = 0; int SF_GLAD_GL_ARB_texture_non_power_of_two = 0; +int SF_GLAD_GL_ARB_texture_storage = 0; +int SF_GLAD_GL_ARB_texture_storage_multisample = 0; +int SF_GLAD_GL_ARB_texture_view = 0; +int SF_GLAD_GL_ARB_timer_query = 0; +int SF_GLAD_GL_ARB_transform_feedback2 = 0; +int SF_GLAD_GL_ARB_transform_feedback3 = 0; +int SF_GLAD_GL_ARB_transform_feedback_instanced = 0; +int SF_GLAD_GL_ARB_uniform_buffer_object = 0; +int SF_GLAD_GL_ARB_vertex_array_object = 0; +int SF_GLAD_GL_ARB_vertex_attrib_64bit = 0; +int SF_GLAD_GL_ARB_vertex_attrib_binding = 0; int SF_GLAD_GL_ARB_vertex_buffer_object = 0; int SF_GLAD_GL_ARB_vertex_program = 0; int SF_GLAD_GL_ARB_vertex_shader = 0; +int SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev = 0; +int SF_GLAD_GL_ARB_viewport_array = 0; int SF_GLAD_GL_EXT_blend_equation_separate = 0; int SF_GLAD_GL_EXT_blend_func_separate = 0; int SF_GLAD_GL_EXT_blend_minmax = 0; @@ -4808,8 +7584,10 @@ int SF_GLAD_GL_EXT_texture_sRGB = 0; int SF_GLAD_GL_EXT_vertex_array = 0; int SF_GLAD_GL_INGR_blend_func_separate = 0; int SF_GLAD_GL_KHR_debug = 0; +int SF_GLAD_GL_KHR_robustness = 0; int SF_GLAD_GL_NV_geometry_program4 = 0; int SF_GLAD_GL_NV_vertex_program = 0; +int SF_GLAD_GL_OES_single_precision = 0; int SF_GLAD_GL_SGIS_texture_edge_clamp = 0; int SF_GLAD_GL_EXT_sRGB = 0; int SF_GLAD_GL_OES_blend_equation_separate = 0; @@ -4819,7 +7597,6 @@ int SF_GLAD_GL_OES_depth24 = 0; int SF_GLAD_GL_OES_depth32 = 0; int SF_GLAD_GL_OES_framebuffer_object = 0; int SF_GLAD_GL_OES_packed_depth_stencil = 0; -int SF_GLAD_GL_OES_single_precision = 0; int SF_GLAD_GL_OES_texture_npot = 0; @@ -4837,48 +7614,95 @@ PFNGLARRAYELEMENTEXTPROC sf_glad_glArrayElementEXT = NULL; PFNGLATTACHOBJECTARBPROC sf_glad_glAttachObjectARB = NULL; PFNGLATTACHSHADERPROC sf_glad_glAttachShader = NULL; PFNGLBEGINPROC sf_glad_glBegin = NULL; +PFNGLBEGINCONDITIONALRENDERPROC sf_glad_glBeginConditionalRender = NULL; +PFNGLBEGINQUERYPROC sf_glad_glBeginQuery = NULL; +PFNGLBEGINQUERYINDEXEDPROC sf_glad_glBeginQueryIndexed = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC sf_glad_glBeginTransformFeedback = NULL; PFNGLBINDATTRIBLOCATIONPROC sf_glad_glBindAttribLocation = NULL; PFNGLBINDATTRIBLOCATIONARBPROC sf_glad_glBindAttribLocationARB = NULL; PFNGLBINDBUFFERPROC sf_glad_glBindBuffer = NULL; PFNGLBINDBUFFERARBPROC sf_glad_glBindBufferARB = NULL; +PFNGLBINDBUFFERBASEPROC sf_glad_glBindBufferBase = NULL; +PFNGLBINDBUFFERRANGEPROC sf_glad_glBindBufferRange = NULL; +PFNGLBINDBUFFERSBASEPROC sf_glad_glBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC sf_glad_glBindBuffersRange = NULL; +PFNGLBINDFRAGDATALOCATIONPROC sf_glad_glBindFragDataLocation = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC sf_glad_glBindFragDataLocationIndexed = NULL; PFNGLBINDFRAMEBUFFERPROC sf_glad_glBindFramebuffer = NULL; PFNGLBINDFRAMEBUFFEREXTPROC sf_glad_glBindFramebufferEXT = NULL; +PFNGLBINDIMAGETEXTUREPROC sf_glad_glBindImageTexture = NULL; +PFNGLBINDIMAGETEXTURESPROC sf_glad_glBindImageTextures = NULL; PFNGLBINDPROGRAMARBPROC sf_glad_glBindProgramARB = NULL; PFNGLBINDPROGRAMNVPROC sf_glad_glBindProgramNV = NULL; PFNGLBINDPROGRAMPIPELINEPROC sf_glad_glBindProgramPipeline = NULL; PFNGLBINDRENDERBUFFERPROC sf_glad_glBindRenderbuffer = NULL; PFNGLBINDRENDERBUFFEREXTPROC sf_glad_glBindRenderbufferEXT = NULL; +PFNGLBINDSAMPLERPROC sf_glad_glBindSampler = NULL; +PFNGLBINDSAMPLERSPROC sf_glad_glBindSamplers = NULL; PFNGLBINDTEXTUREPROC sf_glad_glBindTexture = NULL; PFNGLBINDTEXTUREEXTPROC sf_glad_glBindTextureEXT = NULL; +PFNGLBINDTEXTUREUNITPROC sf_glad_glBindTextureUnit = NULL; +PFNGLBINDTEXTURESPROC sf_glad_glBindTextures = NULL; +PFNGLBINDTRANSFORMFEEDBACKPROC sf_glad_glBindTransformFeedback = NULL; +PFNGLBINDVERTEXARRAYPROC sf_glad_glBindVertexArray = NULL; +PFNGLBINDVERTEXBUFFERPROC sf_glad_glBindVertexBuffer = NULL; +PFNGLBINDVERTEXBUFFERSPROC sf_glad_glBindVertexBuffers = NULL; PFNGLBITMAPPROC sf_glad_glBitmap = NULL; PFNGLBLENDCOLORPROC sf_glad_glBlendColor = NULL; PFNGLBLENDEQUATIONPROC sf_glad_glBlendEquation = NULL; PFNGLBLENDEQUATIONEXTPROC sf_glad_glBlendEquationEXT = NULL; PFNGLBLENDEQUATIONSEPARATEPROC sf_glad_glBlendEquationSeparate = NULL; PFNGLBLENDEQUATIONSEPARATEEXTPROC sf_glad_glBlendEquationSeparateEXT = NULL; +PFNGLBLENDEQUATIONSEPARATEIPROC sf_glad_glBlendEquationSeparatei = NULL; +PFNGLBLENDEQUATIONIPROC sf_glad_glBlendEquationi = NULL; PFNGLBLENDFUNCPROC sf_glad_glBlendFunc = NULL; PFNGLBLENDFUNCSEPARATEPROC sf_glad_glBlendFuncSeparate = NULL; PFNGLBLENDFUNCSEPARATEEXTPROC sf_glad_glBlendFuncSeparateEXT = NULL; PFNGLBLENDFUNCSEPARATEINGRPROC sf_glad_glBlendFuncSeparateINGR = NULL; +PFNGLBLENDFUNCSEPARATEIPROC sf_glad_glBlendFuncSeparatei = NULL; +PFNGLBLENDFUNCIPROC sf_glad_glBlendFunci = NULL; PFNGLBLITFRAMEBUFFERPROC sf_glad_glBlitFramebuffer = NULL; PFNGLBLITFRAMEBUFFEREXTPROC sf_glad_glBlitFramebufferEXT = NULL; +PFNGLBLITNAMEDFRAMEBUFFERPROC sf_glad_glBlitNamedFramebuffer = NULL; PFNGLBUFFERDATAPROC sf_glad_glBufferData = NULL; PFNGLBUFFERDATAARBPROC sf_glad_glBufferDataARB = NULL; +PFNGLBUFFERSTORAGEPROC sf_glad_glBufferStorage = NULL; PFNGLBUFFERSUBDATAPROC sf_glad_glBufferSubData = NULL; PFNGLBUFFERSUBDATAARBPROC sf_glad_glBufferSubDataARB = NULL; PFNGLCALLLISTPROC sf_glad_glCallList = NULL; PFNGLCALLLISTSPROC sf_glad_glCallLists = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC sf_glad_glCheckFramebufferStatus = NULL; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC sf_glad_glCheckFramebufferStatusEXT = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC sf_glad_glCheckNamedFramebufferStatus = NULL; +PFNGLCLAMPCOLORPROC sf_glad_glClampColor = NULL; PFNGLCLEARPROC sf_glad_glClear = NULL; PFNGLCLEARACCUMPROC sf_glad_glClearAccum = NULL; +PFNGLCLEARBUFFERDATAPROC sf_glad_glClearBufferData = NULL; +PFNGLCLEARBUFFERSUBDATAPROC sf_glad_glClearBufferSubData = NULL; +PFNGLCLEARBUFFERFIPROC sf_glad_glClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC sf_glad_glClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC sf_glad_glClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC sf_glad_glClearBufferuiv = NULL; PFNGLCLEARCOLORPROC sf_glad_glClearColor = NULL; PFNGLCLEARDEPTHPROC sf_glad_glClearDepth = NULL; +PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf = NULL; +PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES = NULL; PFNGLCLEARINDEXPROC sf_glad_glClearIndex = NULL; +PFNGLCLEARNAMEDBUFFERDATAPROC sf_glad_glClearNamedBufferData = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAPROC sf_glad_glClearNamedBufferSubData = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFIPROC sf_glad_glClearNamedFramebufferfi = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFVPROC sf_glad_glClearNamedFramebufferfv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERIVPROC sf_glad_glClearNamedFramebufferiv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC sf_glad_glClearNamedFramebufferuiv = NULL; PFNGLCLEARSTENCILPROC sf_glad_glClearStencil = NULL; +PFNGLCLEARTEXIMAGEPROC sf_glad_glClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC sf_glad_glClearTexSubImage = NULL; PFNGLCLIENTACTIVETEXTUREPROC sf_glad_glClientActiveTexture = NULL; PFNGLCLIENTACTIVETEXTUREARBPROC sf_glad_glClientActiveTextureARB = NULL; +PFNGLCLIENTWAITSYNCPROC sf_glad_glClientWaitSync = NULL; +PFNGLCLIPCONTROLPROC sf_glad_glClipControl = NULL; PFNGLCLIPPLANEPROC sf_glad_glClipPlane = NULL; +PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES = NULL; PFNGLCOLOR3BPROC sf_glad_glColor3b = NULL; PFNGLCOLOR3BVPROC sf_glad_glColor3bv = NULL; PFNGLCOLOR3DPROC sf_glad_glColor3d = NULL; @@ -4912,7 +7736,12 @@ PFNGLCOLOR4UIVPROC sf_glad_glColor4uiv = NULL; PFNGLCOLOR4USPROC sf_glad_glColor4us = NULL; PFNGLCOLOR4USVPROC sf_glad_glColor4usv = NULL; PFNGLCOLORMASKPROC sf_glad_glColorMask = NULL; +PFNGLCOLORMASKIPROC sf_glad_glColorMaski = NULL; PFNGLCOLORMATERIALPROC sf_glad_glColorMaterial = NULL; +PFNGLCOLORP3UIPROC sf_glad_glColorP3ui = NULL; +PFNGLCOLORP3UIVPROC sf_glad_glColorP3uiv = NULL; +PFNGLCOLORP4UIPROC sf_glad_glColorP4ui = NULL; +PFNGLCOLORP4UIVPROC sf_glad_glColorP4uiv = NULL; PFNGLCOLORPOINTERPROC sf_glad_glColorPointer = NULL; PFNGLCOLORPOINTEREXTPROC sf_glad_glColorPointerEXT = NULL; PFNGLCOLORSUBTABLEPROC sf_glad_glColorSubTable = NULL; @@ -4921,6 +7750,15 @@ PFNGLCOLORTABLEPARAMETERFVPROC sf_glad_glColorTableParameterfv = NULL; PFNGLCOLORTABLEPARAMETERIVPROC sf_glad_glColorTableParameteriv = NULL; PFNGLCOMPILESHADERPROC sf_glad_glCompileShader = NULL; PFNGLCOMPILESHADERARBPROC sf_glad_glCompileShaderARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC sf_glad_glCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC sf_glad_glCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC sf_glad_glCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC sf_glad_glCompressedTexSubImage3D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC sf_glad_glCompressedTextureSubImage1D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC sf_glad_glCompressedTextureSubImage2D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC sf_glad_glCompressedTextureSubImage3D = NULL; PFNGLCONVOLUTIONFILTER1DPROC sf_glad_glConvolutionFilter1D = NULL; PFNGLCONVOLUTIONFILTER2DPROC sf_glad_glConvolutionFilter2D = NULL; PFNGLCONVOLUTIONPARAMETERFPROC sf_glad_glConvolutionParameterf = NULL; @@ -4932,6 +7770,8 @@ PFNGLCOPYCOLORSUBTABLEPROC sf_glad_glCopyColorSubTable = NULL; PFNGLCOPYCOLORTABLEPROC sf_glad_glCopyColorTable = NULL; PFNGLCOPYCONVOLUTIONFILTER1DPROC sf_glad_glCopyConvolutionFilter1D = NULL; PFNGLCOPYCONVOLUTIONFILTER2DPROC sf_glad_glCopyConvolutionFilter2D = NULL; +PFNGLCOPYIMAGESUBDATAPROC sf_glad_glCopyImageSubData = NULL; +PFNGLCOPYNAMEDBUFFERSUBDATAPROC sf_glad_glCopyNamedBufferSubData = NULL; PFNGLCOPYPIXELSPROC sf_glad_glCopyPixels = NULL; PFNGLCOPYTEXIMAGE1DPROC sf_glad_glCopyTexImage1D = NULL; PFNGLCOPYTEXIMAGE1DEXTPROC sf_glad_glCopyTexImage1DEXT = NULL; @@ -4943,11 +7783,23 @@ PFNGLCOPYTEXSUBIMAGE2DPROC sf_glad_glCopyTexSubImage2D = NULL; PFNGLCOPYTEXSUBIMAGE2DEXTPROC sf_glad_glCopyTexSubImage2DEXT = NULL; PFNGLCOPYTEXSUBIMAGE3DPROC sf_glad_glCopyTexSubImage3D = NULL; PFNGLCOPYTEXSUBIMAGE3DEXTPROC sf_glad_glCopyTexSubImage3DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DPROC sf_glad_glCopyTextureSubImage1D = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DPROC sf_glad_glCopyTextureSubImage2D = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DPROC sf_glad_glCopyTextureSubImage3D = NULL; +PFNGLCREATEBUFFERSPROC sf_glad_glCreateBuffers = NULL; +PFNGLCREATEFRAMEBUFFERSPROC sf_glad_glCreateFramebuffers = NULL; PFNGLCREATEPROGRAMPROC sf_glad_glCreateProgram = NULL; PFNGLCREATEPROGRAMOBJECTARBPROC sf_glad_glCreateProgramObjectARB = NULL; +PFNGLCREATEPROGRAMPIPELINESPROC sf_glad_glCreateProgramPipelines = NULL; +PFNGLCREATEQUERIESPROC sf_glad_glCreateQueries = NULL; +PFNGLCREATERENDERBUFFERSPROC sf_glad_glCreateRenderbuffers = NULL; +PFNGLCREATESAMPLERSPROC sf_glad_glCreateSamplers = NULL; PFNGLCREATESHADERPROC sf_glad_glCreateShader = NULL; PFNGLCREATESHADEROBJECTARBPROC sf_glad_glCreateShaderObjectARB = NULL; PFNGLCREATESHADERPROGRAMVPROC sf_glad_glCreateShaderProgramv = NULL; +PFNGLCREATETEXTURESPROC sf_glad_glCreateTextures = NULL; +PFNGLCREATETRANSFORMFEEDBACKSPROC sf_glad_glCreateTransformFeedbacks = NULL; +PFNGLCREATEVERTEXARRAYSPROC sf_glad_glCreateVertexArrays = NULL; PFNGLCULLFACEPROC sf_glad_glCullFace = NULL; PFNGLDEBUGMESSAGECALLBACKPROC sf_glad_glDebugMessageCallback = NULL; PFNGLDEBUGMESSAGECONTROLPROC sf_glad_glDebugMessageControl = NULL; @@ -4958,37 +7810,76 @@ PFNGLDELETEFRAMEBUFFERSPROC sf_glad_glDeleteFramebuffers = NULL; PFNGLDELETEFRAMEBUFFERSEXTPROC sf_glad_glDeleteFramebuffersEXT = NULL; PFNGLDELETELISTSPROC sf_glad_glDeleteLists = NULL; PFNGLDELETEOBJECTARBPROC sf_glad_glDeleteObjectARB = NULL; +PFNGLDELETEPROGRAMPROC sf_glad_glDeleteProgram = NULL; PFNGLDELETEPROGRAMPIPELINESPROC sf_glad_glDeleteProgramPipelines = NULL; PFNGLDELETEPROGRAMSARBPROC sf_glad_glDeleteProgramsARB = NULL; PFNGLDELETEPROGRAMSNVPROC sf_glad_glDeleteProgramsNV = NULL; +PFNGLDELETEQUERIESPROC sf_glad_glDeleteQueries = NULL; PFNGLDELETERENDERBUFFERSPROC sf_glad_glDeleteRenderbuffers = NULL; PFNGLDELETERENDERBUFFERSEXTPROC sf_glad_glDeleteRenderbuffersEXT = NULL; +PFNGLDELETESAMPLERSPROC sf_glad_glDeleteSamplers = NULL; +PFNGLDELETESHADERPROC sf_glad_glDeleteShader = NULL; +PFNGLDELETESYNCPROC sf_glad_glDeleteSync = NULL; PFNGLDELETETEXTURESPROC sf_glad_glDeleteTextures = NULL; PFNGLDELETETEXTURESEXTPROC sf_glad_glDeleteTexturesEXT = NULL; +PFNGLDELETETRANSFORMFEEDBACKSPROC sf_glad_glDeleteTransformFeedbacks = NULL; +PFNGLDELETEVERTEXARRAYSPROC sf_glad_glDeleteVertexArrays = NULL; PFNGLDEPTHFUNCPROC sf_glad_glDepthFunc = NULL; PFNGLDEPTHMASKPROC sf_glad_glDepthMask = NULL; PFNGLDEPTHRANGEPROC sf_glad_glDepthRange = NULL; +PFNGLDEPTHRANGEARRAYDVNVPROC sf_glad_glDepthRangeArraydvNV = NULL; +PFNGLDEPTHRANGEARRAYVPROC sf_glad_glDepthRangeArrayv = NULL; +PFNGLDEPTHRANGEINDEXEDPROC sf_glad_glDepthRangeIndexed = NULL; +PFNGLDEPTHRANGEINDEXEDDNVPROC sf_glad_glDepthRangeIndexeddNV = NULL; +PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef = NULL; +PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES = NULL; PFNGLDETACHOBJECTARBPROC sf_glad_glDetachObjectARB = NULL; PFNGLDETACHSHADERPROC sf_glad_glDetachShader = NULL; PFNGLDISABLEPROC sf_glad_glDisable = NULL; PFNGLDISABLECLIENTSTATEPROC sf_glad_glDisableClientState = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBPROC sf_glad_glDisableVertexArrayAttrib = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC sf_glad_glDisableVertexAttribArray = NULL; PFNGLDISABLEVERTEXATTRIBARRAYARBPROC sf_glad_glDisableVertexAttribArrayARB = NULL; +PFNGLDISABLEIPROC sf_glad_glDisablei = NULL; +PFNGLDISPATCHCOMPUTEPROC sf_glad_glDispatchCompute = NULL; +PFNGLDISPATCHCOMPUTEINDIRECTPROC sf_glad_glDispatchComputeIndirect = NULL; PFNGLDRAWARRAYSPROC sf_glad_glDrawArrays = NULL; PFNGLDRAWARRAYSEXTPROC sf_glad_glDrawArraysEXT = NULL; +PFNGLDRAWARRAYSINDIRECTPROC sf_glad_glDrawArraysIndirect = NULL; +PFNGLDRAWARRAYSINSTANCEDPROC sf_glad_glDrawArraysInstanced = NULL; +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawArraysInstancedBaseInstance = NULL; PFNGLDRAWBUFFERPROC sf_glad_glDrawBuffer = NULL; +PFNGLDRAWBUFFERSPROC sf_glad_glDrawBuffers = NULL; PFNGLDRAWELEMENTSPROC sf_glad_glDrawElements = NULL; +PFNGLDRAWELEMENTSBASEVERTEXPROC sf_glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINDIRECTPROC sf_glad_glDrawElementsIndirect = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC sf_glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC sf_glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC sf_glad_glDrawElementsInstancedBaseVertexBaseInstance = NULL; PFNGLDRAWPIXELSPROC sf_glad_glDrawPixels = NULL; +PFNGLDRAWRANGEELEMENTSPROC sf_glad_glDrawRangeElements = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC sf_glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLDRAWTRANSFORMFEEDBACKPROC sf_glad_glDrawTransformFeedback = NULL; +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC sf_glad_glDrawTransformFeedbackInstanced = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC sf_glad_glDrawTransformFeedbackStream = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC sf_glad_glDrawTransformFeedbackStreamInstanced = NULL; PFNGLEDGEFLAGPROC sf_glad_glEdgeFlag = NULL; PFNGLEDGEFLAGPOINTERPROC sf_glad_glEdgeFlagPointer = NULL; PFNGLEDGEFLAGPOINTEREXTPROC sf_glad_glEdgeFlagPointerEXT = NULL; PFNGLEDGEFLAGVPROC sf_glad_glEdgeFlagv = NULL; PFNGLENABLEPROC sf_glad_glEnable = NULL; PFNGLENABLECLIENTSTATEPROC sf_glad_glEnableClientState = NULL; +PFNGLENABLEVERTEXARRAYATTRIBPROC sf_glad_glEnableVertexArrayAttrib = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC sf_glad_glEnableVertexAttribArray = NULL; PFNGLENABLEVERTEXATTRIBARRAYARBPROC sf_glad_glEnableVertexAttribArrayARB = NULL; +PFNGLENABLEIPROC sf_glad_glEnablei = NULL; PFNGLENDPROC sf_glad_glEnd = NULL; +PFNGLENDCONDITIONALRENDERPROC sf_glad_glEndConditionalRender = NULL; PFNGLENDLISTPROC sf_glad_glEndList = NULL; +PFNGLENDQUERYPROC sf_glad_glEndQuery = NULL; +PFNGLENDQUERYINDEXEDPROC sf_glad_glEndQueryIndexed = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC sf_glad_glEndTransformFeedback = NULL; PFNGLEVALCOORD1DPROC sf_glad_glEvalCoord1d = NULL; PFNGLEVALCOORD1DVPROC sf_glad_glEvalCoord1dv = NULL; PFNGLEVALCOORD1FPROC sf_glad_glEvalCoord1f = NULL; @@ -5003,12 +7894,21 @@ PFNGLEVALPOINT1PROC sf_glad_glEvalPoint1 = NULL; PFNGLEVALPOINT2PROC sf_glad_glEvalPoint2 = NULL; PFNGLEXECUTEPROGRAMNVPROC sf_glad_glExecuteProgramNV = NULL; PFNGLFEEDBACKBUFFERPROC sf_glad_glFeedbackBuffer = NULL; +PFNGLFENCESYNCPROC sf_glad_glFenceSync = NULL; PFNGLFINISHPROC sf_glad_glFinish = NULL; PFNGLFLUSHPROC sf_glad_glFlush = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC sf_glad_glFlushMappedBufferRange = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC sf_glad_glFlushMappedNamedBufferRange = NULL; +PFNGLFOGCOORDPOINTERPROC sf_glad_glFogCoordPointer = NULL; +PFNGLFOGCOORDDPROC sf_glad_glFogCoordd = NULL; +PFNGLFOGCOORDDVPROC sf_glad_glFogCoorddv = NULL; +PFNGLFOGCOORDFPROC sf_glad_glFogCoordf = NULL; +PFNGLFOGCOORDFVPROC sf_glad_glFogCoordfv = NULL; PFNGLFOGFPROC sf_glad_glFogf = NULL; PFNGLFOGFVPROC sf_glad_glFogfv = NULL; PFNGLFOGIPROC sf_glad_glFogi = NULL; PFNGLFOGIVPROC sf_glad_glFogiv = NULL; +PFNGLFRAMEBUFFERPARAMETERIPROC sf_glad_glFramebufferParameteri = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC sf_glad_glFramebufferRenderbuffer = NULL; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC sf_glad_glFramebufferRenderbufferEXT = NULL; PFNGLFRAMEBUFFERTEXTUREPROC sf_glad_glFramebufferTexture = NULL; @@ -5027,6 +7927,7 @@ PFNGLFRAMEBUFFERTEXTURELAYERARBPROC sf_glad_glFramebufferTextureLayerARB = NULL; PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC sf_glad_glFramebufferTextureLayerEXT = NULL; PFNGLFRONTFACEPROC sf_glad_glFrontFace = NULL; PFNGLFRUSTUMPROC sf_glad_glFrustum = NULL; +PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES = NULL; PFNGLGENBUFFERSPROC sf_glad_glGenBuffers = NULL; PFNGLGENBUFFERSARBPROC sf_glad_glGenBuffersARB = NULL; PFNGLGENFRAMEBUFFERSPROC sf_glad_glGenFramebuffers = NULL; @@ -5035,20 +7936,36 @@ PFNGLGENLISTSPROC sf_glad_glGenLists = NULL; PFNGLGENPROGRAMPIPELINESPROC sf_glad_glGenProgramPipelines = NULL; PFNGLGENPROGRAMSARBPROC sf_glad_glGenProgramsARB = NULL; PFNGLGENPROGRAMSNVPROC sf_glad_glGenProgramsNV = NULL; +PFNGLGENQUERIESPROC sf_glad_glGenQueries = NULL; PFNGLGENRENDERBUFFERSPROC sf_glad_glGenRenderbuffers = NULL; PFNGLGENRENDERBUFFERSEXTPROC sf_glad_glGenRenderbuffersEXT = NULL; +PFNGLGENSAMPLERSPROC sf_glad_glGenSamplers = NULL; PFNGLGENTEXTURESPROC sf_glad_glGenTextures = NULL; PFNGLGENTEXTURESEXTPROC sf_glad_glGenTexturesEXT = NULL; +PFNGLGENTRANSFORMFEEDBACKSPROC sf_glad_glGenTransformFeedbacks = NULL; +PFNGLGENVERTEXARRAYSPROC sf_glad_glGenVertexArrays = NULL; PFNGLGENERATEMIPMAPPROC sf_glad_glGenerateMipmap = NULL; PFNGLGENERATEMIPMAPEXTPROC sf_glad_glGenerateMipmapEXT = NULL; +PFNGLGENERATETEXTUREMIPMAPPROC sf_glad_glGenerateTextureMipmap = NULL; +PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC sf_glad_glGetActiveAtomicCounterBufferiv = NULL; PFNGLGETACTIVEATTRIBPROC sf_glad_glGetActiveAttrib = NULL; PFNGLGETACTIVEATTRIBARBPROC sf_glad_glGetActiveAttribARB = NULL; +PFNGLGETACTIVESUBROUTINENAMEPROC sf_glad_glGetActiveSubroutineName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC sf_glad_glGetActiveSubroutineUniformName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC sf_glad_glGetActiveSubroutineUniformiv = NULL; PFNGLGETACTIVEUNIFORMPROC sf_glad_glGetActiveUniform = NULL; PFNGLGETACTIVEUNIFORMARBPROC sf_glad_glGetActiveUniformARB = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC sf_glad_glGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC sf_glad_glGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC sf_glad_glGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC sf_glad_glGetActiveUniformsiv = NULL; PFNGLGETATTACHEDOBJECTSARBPROC sf_glad_glGetAttachedObjectsARB = NULL; +PFNGLGETATTACHEDSHADERSPROC sf_glad_glGetAttachedShaders = NULL; PFNGLGETATTRIBLOCATIONPROC sf_glad_glGetAttribLocation = NULL; PFNGLGETATTRIBLOCATIONARBPROC sf_glad_glGetAttribLocationARB = NULL; +PFNGLGETBOOLEANI_VPROC sf_glad_glGetBooleani_v = NULL; PFNGLGETBOOLEANVPROC sf_glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC sf_glad_glGetBufferParameteri64v = NULL; PFNGLGETBUFFERPARAMETERIVPROC sf_glad_glGetBufferParameteriv = NULL; PFNGLGETBUFFERPARAMETERIVARBPROC sf_glad_glGetBufferParameterivARB = NULL; PFNGLGETBUFFERPOINTERVPROC sf_glad_glGetBufferPointerv = NULL; @@ -5056,24 +7973,39 @@ PFNGLGETBUFFERPOINTERVARBPROC sf_glad_glGetBufferPointervARB = NULL; PFNGLGETBUFFERSUBDATAPROC sf_glad_glGetBufferSubData = NULL; PFNGLGETBUFFERSUBDATAARBPROC sf_glad_glGetBufferSubDataARB = NULL; PFNGLGETCLIPPLANEPROC sf_glad_glGetClipPlane = NULL; +PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES = NULL; PFNGLGETCOLORTABLEPROC sf_glad_glGetColorTable = NULL; PFNGLGETCOLORTABLEPARAMETERFVPROC sf_glad_glGetColorTableParameterfv = NULL; PFNGLGETCOLORTABLEPARAMETERIVPROC sf_glad_glGetColorTableParameteriv = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC sf_glad_glGetCompressedTexImage = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC sf_glad_glGetCompressedTextureImage = NULL; +PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC sf_glad_glGetCompressedTextureSubImage = NULL; PFNGLGETCONVOLUTIONFILTERPROC sf_glad_glGetConvolutionFilter = NULL; PFNGLGETCONVOLUTIONPARAMETERFVPROC sf_glad_glGetConvolutionParameterfv = NULL; PFNGLGETCONVOLUTIONPARAMETERIVPROC sf_glad_glGetConvolutionParameteriv = NULL; PFNGLGETDEBUGMESSAGELOGPROC sf_glad_glGetDebugMessageLog = NULL; +PFNGLGETDOUBLEI_VPROC sf_glad_glGetDoublei_v = NULL; PFNGLGETDOUBLEVPROC sf_glad_glGetDoublev = NULL; PFNGLGETERRORPROC sf_glad_glGetError = NULL; +PFNGLGETFLOATI_VPROC sf_glad_glGetFloati_v = NULL; PFNGLGETFLOATVPROC sf_glad_glGetFloatv = NULL; +PFNGLGETFRAGDATAINDEXPROC sf_glad_glGetFragDataIndex = NULL; +PFNGLGETFRAGDATALOCATIONPROC sf_glad_glGetFragDataLocation = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetFramebufferAttachmentParameteriv = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC sf_glad_glGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetFramebufferParameteriv = NULL; +PFNGLGETGRAPHICSRESETSTATUSPROC sf_glad_glGetGraphicsResetStatus = NULL; PFNGLGETHANDLEARBPROC sf_glad_glGetHandleARB = NULL; PFNGLGETHISTOGRAMPROC sf_glad_glGetHistogram = NULL; PFNGLGETHISTOGRAMPARAMETERFVPROC sf_glad_glGetHistogramParameterfv = NULL; PFNGLGETHISTOGRAMPARAMETERIVPROC sf_glad_glGetHistogramParameteriv = NULL; PFNGLGETINFOLOGARBPROC sf_glad_glGetInfoLogARB = NULL; +PFNGLGETINTEGER64I_VPROC sf_glad_glGetInteger64i_v = NULL; +PFNGLGETINTEGER64VPROC sf_glad_glGetInteger64v = NULL; +PFNGLGETINTEGERI_VPROC sf_glad_glGetIntegeri_v = NULL; PFNGLGETINTEGERVPROC sf_glad_glGetIntegerv = NULL; +PFNGLGETINTERNALFORMATI64VPROC sf_glad_glGetInternalformati64v = NULL; +PFNGLGETINTERNALFORMATIVPROC sf_glad_glGetInternalformativ = NULL; PFNGLGETLIGHTFVPROC sf_glad_glGetLightfv = NULL; PFNGLGETLIGHTIVPROC sf_glad_glGetLightiv = NULL; PFNGLGETMAPDVPROC sf_glad_glGetMapdv = NULL; @@ -5084,6 +8016,14 @@ PFNGLGETMATERIALIVPROC sf_glad_glGetMaterialiv = NULL; PFNGLGETMINMAXPROC sf_glad_glGetMinmax = NULL; PFNGLGETMINMAXPARAMETERFVPROC sf_glad_glGetMinmaxParameterfv = NULL; PFNGLGETMINMAXPARAMETERIVPROC sf_glad_glGetMinmaxParameteriv = NULL; +PFNGLGETMULTISAMPLEFVPROC sf_glad_glGetMultisamplefv = NULL; +PFNGLGETNAMEDBUFFERPARAMETERI64VPROC sf_glad_glGetNamedBufferParameteri64v = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVPROC sf_glad_glGetNamedBufferParameteriv = NULL; +PFNGLGETNAMEDBUFFERPOINTERVPROC sf_glad_glGetNamedBufferPointerv = NULL; +PFNGLGETNAMEDBUFFERSUBDATAPROC sf_glad_glGetNamedBufferSubData = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC sf_glad_glGetNamedFramebufferAttachmentParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC sf_glad_glGetNamedFramebufferParameteriv = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC sf_glad_glGetNamedRenderbufferParameteriv = NULL; PFNGLGETOBJECTLABELPROC sf_glad_glGetObjectLabel = NULL; PFNGLGETOBJECTPARAMETERFVARBPROC sf_glad_glGetObjectParameterfvARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC sf_glad_glGetObjectParameterivARB = NULL; @@ -5097,22 +8037,52 @@ PFNGLGETPOLYGONSTIPPLEPROC sf_glad_glGetPolygonStipple = NULL; PFNGLGETPROGRAMBINARYPROC sf_glad_glGetProgramBinary = NULL; PFNGLGETPROGRAMENVPARAMETERDVARBPROC sf_glad_glGetProgramEnvParameterdvARB = NULL; PFNGLGETPROGRAMENVPARAMETERFVARBPROC sf_glad_glGetProgramEnvParameterfvARB = NULL; +PFNGLGETPROGRAMINFOLOGPROC sf_glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMINTERFACEIVPROC sf_glad_glGetProgramInterfaceiv = NULL; PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC sf_glad_glGetProgramLocalParameterdvARB = NULL; PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC sf_glad_glGetProgramLocalParameterfvARB = NULL; PFNGLGETPROGRAMPARAMETERDVNVPROC sf_glad_glGetProgramParameterdvNV = NULL; PFNGLGETPROGRAMPARAMETERFVNVPROC sf_glad_glGetProgramParameterfvNV = NULL; PFNGLGETPROGRAMPIPELINEINFOLOGPROC sf_glad_glGetProgramPipelineInfoLog = NULL; PFNGLGETPROGRAMPIPELINEIVPROC sf_glad_glGetProgramPipelineiv = NULL; +PFNGLGETPROGRAMRESOURCEINDEXPROC sf_glad_glGetProgramResourceIndex = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONPROC sf_glad_glGetProgramResourceLocation = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC sf_glad_glGetProgramResourceLocationIndex = NULL; +PFNGLGETPROGRAMRESOURCENAMEPROC sf_glad_glGetProgramResourceName = NULL; +PFNGLGETPROGRAMRESOURCEIVPROC sf_glad_glGetProgramResourceiv = NULL; +PFNGLGETPROGRAMSTAGEIVPROC sf_glad_glGetProgramStageiv = NULL; PFNGLGETPROGRAMSTRINGARBPROC sf_glad_glGetProgramStringARB = NULL; PFNGLGETPROGRAMSTRINGNVPROC sf_glad_glGetProgramStringNV = NULL; +PFNGLGETPROGRAMIVPROC sf_glad_glGetProgramiv = NULL; PFNGLGETPROGRAMIVARBPROC sf_glad_glGetProgramivARB = NULL; PFNGLGETPROGRAMIVNVPROC sf_glad_glGetProgramivNV = NULL; +PFNGLGETQUERYBUFFEROBJECTI64VPROC sf_glad_glGetQueryBufferObjecti64v = NULL; +PFNGLGETQUERYBUFFEROBJECTIVPROC sf_glad_glGetQueryBufferObjectiv = NULL; +PFNGLGETQUERYBUFFEROBJECTUI64VPROC sf_glad_glGetQueryBufferObjectui64v = NULL; +PFNGLGETQUERYBUFFEROBJECTUIVPROC sf_glad_glGetQueryBufferObjectuiv = NULL; +PFNGLGETQUERYINDEXEDIVPROC sf_glad_glGetQueryIndexediv = NULL; +PFNGLGETQUERYOBJECTI64VPROC sf_glad_glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTIVPROC sf_glad_glGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUI64VPROC sf_glad_glGetQueryObjectui64v = NULL; +PFNGLGETQUERYOBJECTUIVPROC sf_glad_glGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC sf_glad_glGetQueryiv = NULL; PFNGLGETRENDERBUFFERPARAMETERIVPROC sf_glad_glGetRenderbufferParameteriv = NULL; PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC sf_glad_glGetRenderbufferParameterivEXT = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC sf_glad_glGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC sf_glad_glGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC sf_glad_glGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC sf_glad_glGetSamplerParameteriv = NULL; PFNGLGETSEPARABLEFILTERPROC sf_glad_glGetSeparableFilter = NULL; +PFNGLGETSHADERINFOLOGPROC sf_glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC sf_glad_glGetShaderPrecisionFormat = NULL; PFNGLGETSHADERSOURCEPROC sf_glad_glGetShaderSource = NULL; PFNGLGETSHADERSOURCEARBPROC sf_glad_glGetShaderSourceARB = NULL; +PFNGLGETSHADERIVPROC sf_glad_glGetShaderiv = NULL; PFNGLGETSTRINGPROC sf_glad_glGetString = NULL; +PFNGLGETSTRINGIPROC sf_glad_glGetStringi = NULL; +PFNGLGETSUBROUTINEINDEXPROC sf_glad_glGetSubroutineIndex = NULL; +PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC sf_glad_glGetSubroutineUniformLocation = NULL; +PFNGLGETSYNCIVPROC sf_glad_glGetSynciv = NULL; PFNGLGETTEXENVFVPROC sf_glad_glGetTexEnvfv = NULL; PFNGLGETTEXENVIVPROC sf_glad_glGetTexEnviv = NULL; PFNGLGETTEXGENDVPROC sf_glad_glGetTexGendv = NULL; @@ -5121,15 +8091,40 @@ PFNGLGETTEXGENIVPROC sf_glad_glGetTexGeniv = NULL; PFNGLGETTEXIMAGEPROC sf_glad_glGetTexImage = NULL; PFNGLGETTEXLEVELPARAMETERFVPROC sf_glad_glGetTexLevelParameterfv = NULL; PFNGLGETTEXLEVELPARAMETERIVPROC sf_glad_glGetTexLevelParameteriv = NULL; +PFNGLGETTEXPARAMETERIIVPROC sf_glad_glGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIUIVPROC sf_glad_glGetTexParameterIuiv = NULL; PFNGLGETTEXPARAMETERFVPROC sf_glad_glGetTexParameterfv = NULL; PFNGLGETTEXPARAMETERIVPROC sf_glad_glGetTexParameteriv = NULL; +PFNGLGETTEXTUREIMAGEPROC sf_glad_glGetTextureImage = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVPROC sf_glad_glGetTextureLevelParameterfv = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVPROC sf_glad_glGetTextureLevelParameteriv = NULL; +PFNGLGETTEXTUREPARAMETERIIVPROC sf_glad_glGetTextureParameterIiv = NULL; +PFNGLGETTEXTUREPARAMETERIUIVPROC sf_glad_glGetTextureParameterIuiv = NULL; +PFNGLGETTEXTUREPARAMETERFVPROC sf_glad_glGetTextureParameterfv = NULL; +PFNGLGETTEXTUREPARAMETERIVPROC sf_glad_glGetTextureParameteriv = NULL; +PFNGLGETTEXTURESUBIMAGEPROC sf_glad_glGetTextureSubImage = NULL; PFNGLGETTRACKMATRIXIVNVPROC sf_glad_glGetTrackMatrixivNV = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC sf_glad_glGetTransformFeedbackVarying = NULL; +PFNGLGETTRANSFORMFEEDBACKI64_VPROC sf_glad_glGetTransformFeedbacki64_v = NULL; +PFNGLGETTRANSFORMFEEDBACKI_VPROC sf_glad_glGetTransformFeedbacki_v = NULL; +PFNGLGETTRANSFORMFEEDBACKIVPROC sf_glad_glGetTransformFeedbackiv = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC sf_glad_glGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC sf_glad_glGetUniformIndices = NULL; PFNGLGETUNIFORMLOCATIONPROC sf_glad_glGetUniformLocation = NULL; PFNGLGETUNIFORMLOCATIONARBPROC sf_glad_glGetUniformLocationARB = NULL; +PFNGLGETUNIFORMSUBROUTINEUIVPROC sf_glad_glGetUniformSubroutineuiv = NULL; +PFNGLGETUNIFORMDVPROC sf_glad_glGetUniformdv = NULL; PFNGLGETUNIFORMFVPROC sf_glad_glGetUniformfv = NULL; PFNGLGETUNIFORMFVARBPROC sf_glad_glGetUniformfvARB = NULL; PFNGLGETUNIFORMIVPROC sf_glad_glGetUniformiv = NULL; PFNGLGETUNIFORMIVARBPROC sf_glad_glGetUniformivARB = NULL; +PFNGLGETUNIFORMUIVPROC sf_glad_glGetUniformuiv = NULL; +PFNGLGETVERTEXARRAYINDEXED64IVPROC sf_glad_glGetVertexArrayIndexed64iv = NULL; +PFNGLGETVERTEXARRAYINDEXEDIVPROC sf_glad_glGetVertexArrayIndexediv = NULL; +PFNGLGETVERTEXARRAYIVPROC sf_glad_glGetVertexArrayiv = NULL; +PFNGLGETVERTEXATTRIBIIVPROC sf_glad_glGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC sf_glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBLDVPROC sf_glad_glGetVertexAttribLdv = NULL; PFNGLGETVERTEXATTRIBPOINTERVPROC sf_glad_glGetVertexAttribPointerv = NULL; PFNGLGETVERTEXATTRIBPOINTERVARBPROC sf_glad_glGetVertexAttribPointervARB = NULL; PFNGLGETVERTEXATTRIBPOINTERVNVPROC sf_glad_glGetVertexAttribPointervNV = NULL; @@ -5142,6 +8137,24 @@ PFNGLGETVERTEXATTRIBFVNVPROC sf_glad_glGetVertexAttribfvNV = NULL; PFNGLGETVERTEXATTRIBIVPROC sf_glad_glGetVertexAttribiv = NULL; PFNGLGETVERTEXATTRIBIVARBPROC sf_glad_glGetVertexAttribivARB = NULL; PFNGLGETVERTEXATTRIBIVNVPROC sf_glad_glGetVertexAttribivNV = NULL; +PFNGLGETNCOLORTABLEPROC sf_glad_glGetnColorTable = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEPROC sf_glad_glGetnCompressedTexImage = NULL; +PFNGLGETNCONVOLUTIONFILTERPROC sf_glad_glGetnConvolutionFilter = NULL; +PFNGLGETNHISTOGRAMPROC sf_glad_glGetnHistogram = NULL; +PFNGLGETNMAPDVPROC sf_glad_glGetnMapdv = NULL; +PFNGLGETNMAPFVPROC sf_glad_glGetnMapfv = NULL; +PFNGLGETNMAPIVPROC sf_glad_glGetnMapiv = NULL; +PFNGLGETNMINMAXPROC sf_glad_glGetnMinmax = NULL; +PFNGLGETNPIXELMAPFVPROC sf_glad_glGetnPixelMapfv = NULL; +PFNGLGETNPIXELMAPUIVPROC sf_glad_glGetnPixelMapuiv = NULL; +PFNGLGETNPIXELMAPUSVPROC sf_glad_glGetnPixelMapusv = NULL; +PFNGLGETNPOLYGONSTIPPLEPROC sf_glad_glGetnPolygonStipple = NULL; +PFNGLGETNSEPARABLEFILTERPROC sf_glad_glGetnSeparableFilter = NULL; +PFNGLGETNTEXIMAGEPROC sf_glad_glGetnTexImage = NULL; +PFNGLGETNUNIFORMDVPROC sf_glad_glGetnUniformdv = NULL; +PFNGLGETNUNIFORMFVPROC sf_glad_glGetnUniformfv = NULL; +PFNGLGETNUNIFORMIVPROC sf_glad_glGetnUniformiv = NULL; +PFNGLGETNUNIFORMUIVPROC sf_glad_glGetnUniformuiv = NULL; PFNGLHINTPROC sf_glad_glHint = NULL; PFNGLHISTOGRAMPROC sf_glad_glHistogram = NULL; PFNGLINDEXMASKPROC sf_glad_glIndexMask = NULL; @@ -5159,19 +8172,35 @@ PFNGLINDEXUBPROC sf_glad_glIndexub = NULL; PFNGLINDEXUBVPROC sf_glad_glIndexubv = NULL; PFNGLINITNAMESPROC sf_glad_glInitNames = NULL; PFNGLINTERLEAVEDARRAYSPROC sf_glad_glInterleavedArrays = NULL; +PFNGLINVALIDATEBUFFERDATAPROC sf_glad_glInvalidateBufferData = NULL; +PFNGLINVALIDATEBUFFERSUBDATAPROC sf_glad_glInvalidateBufferSubData = NULL; +PFNGLINVALIDATEFRAMEBUFFERPROC sf_glad_glInvalidateFramebuffer = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC sf_glad_glInvalidateNamedFramebufferData = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC sf_glad_glInvalidateNamedFramebufferSubData = NULL; +PFNGLINVALIDATESUBFRAMEBUFFERPROC sf_glad_glInvalidateSubFramebuffer = NULL; +PFNGLINVALIDATETEXIMAGEPROC sf_glad_glInvalidateTexImage = NULL; +PFNGLINVALIDATETEXSUBIMAGEPROC sf_glad_glInvalidateTexSubImage = NULL; PFNGLISBUFFERPROC sf_glad_glIsBuffer = NULL; PFNGLISBUFFERARBPROC sf_glad_glIsBufferARB = NULL; PFNGLISENABLEDPROC sf_glad_glIsEnabled = NULL; +PFNGLISENABLEDIPROC sf_glad_glIsEnabledi = NULL; PFNGLISFRAMEBUFFERPROC sf_glad_glIsFramebuffer = NULL; PFNGLISFRAMEBUFFEREXTPROC sf_glad_glIsFramebufferEXT = NULL; PFNGLISLISTPROC sf_glad_glIsList = NULL; +PFNGLISPROGRAMPROC sf_glad_glIsProgram = NULL; PFNGLISPROGRAMARBPROC sf_glad_glIsProgramARB = NULL; PFNGLISPROGRAMNVPROC sf_glad_glIsProgramNV = NULL; PFNGLISPROGRAMPIPELINEPROC sf_glad_glIsProgramPipeline = NULL; +PFNGLISQUERYPROC sf_glad_glIsQuery = NULL; PFNGLISRENDERBUFFERPROC sf_glad_glIsRenderbuffer = NULL; PFNGLISRENDERBUFFEREXTPROC sf_glad_glIsRenderbufferEXT = NULL; +PFNGLISSAMPLERPROC sf_glad_glIsSampler = NULL; +PFNGLISSHADERPROC sf_glad_glIsShader = NULL; +PFNGLISSYNCPROC sf_glad_glIsSync = NULL; PFNGLISTEXTUREPROC sf_glad_glIsTexture = NULL; PFNGLISTEXTUREEXTPROC sf_glad_glIsTextureEXT = NULL; +PFNGLISTRANSFORMFEEDBACKPROC sf_glad_glIsTransformFeedback = NULL; +PFNGLISVERTEXARRAYPROC sf_glad_glIsVertexArray = NULL; PFNGLLIGHTMODELFPROC sf_glad_glLightModelf = NULL; PFNGLLIGHTMODELFVPROC sf_glad_glLightModelfv = NULL; PFNGLLIGHTMODELIPROC sf_glad_glLightModeli = NULL; @@ -5190,6 +8219,8 @@ PFNGLLOADMATRIXDPROC sf_glad_glLoadMatrixd = NULL; PFNGLLOADMATRIXFPROC sf_glad_glLoadMatrixf = NULL; PFNGLLOADNAMEPROC sf_glad_glLoadName = NULL; PFNGLLOADPROGRAMNVPROC sf_glad_glLoadProgramNV = NULL; +PFNGLLOADTRANSPOSEMATRIXDPROC sf_glad_glLoadTransposeMatrixd = NULL; +PFNGLLOADTRANSPOSEMATRIXFPROC sf_glad_glLoadTransposeMatrixf = NULL; PFNGLLOGICOPPROC sf_glad_glLogicOp = NULL; PFNGLMAP1DPROC sf_glad_glMap1d = NULL; PFNGLMAP1FPROC sf_glad_glMap1f = NULL; @@ -5197,18 +8228,33 @@ PFNGLMAP2DPROC sf_glad_glMap2d = NULL; PFNGLMAP2FPROC sf_glad_glMap2f = NULL; PFNGLMAPBUFFERPROC sf_glad_glMapBuffer = NULL; PFNGLMAPBUFFERARBPROC sf_glad_glMapBufferARB = NULL; +PFNGLMAPBUFFERRANGEPROC sf_glad_glMapBufferRange = NULL; PFNGLMAPGRID1DPROC sf_glad_glMapGrid1d = NULL; PFNGLMAPGRID1FPROC sf_glad_glMapGrid1f = NULL; PFNGLMAPGRID2DPROC sf_glad_glMapGrid2d = NULL; PFNGLMAPGRID2FPROC sf_glad_glMapGrid2f = NULL; +PFNGLMAPNAMEDBUFFERPROC sf_glad_glMapNamedBuffer = NULL; +PFNGLMAPNAMEDBUFFERRANGEPROC sf_glad_glMapNamedBufferRange = NULL; PFNGLMATERIALFPROC sf_glad_glMaterialf = NULL; PFNGLMATERIALFVPROC sf_glad_glMaterialfv = NULL; PFNGLMATERIALIPROC sf_glad_glMateriali = NULL; PFNGLMATERIALIVPROC sf_glad_glMaterialiv = NULL; PFNGLMATRIXMODEPROC sf_glad_glMatrixMode = NULL; +PFNGLMEMORYBARRIERPROC sf_glad_glMemoryBarrier = NULL; +PFNGLMEMORYBARRIERBYREGIONPROC sf_glad_glMemoryBarrierByRegion = NULL; +PFNGLMINSAMPLESHADINGPROC sf_glad_glMinSampleShading = NULL; PFNGLMINMAXPROC sf_glad_glMinmax = NULL; PFNGLMULTMATRIXDPROC sf_glad_glMultMatrixd = NULL; PFNGLMULTMATRIXFPROC sf_glad_glMultMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXDPROC sf_glad_glMultTransposeMatrixd = NULL; +PFNGLMULTTRANSPOSEMATRIXFPROC sf_glad_glMultTransposeMatrixf = NULL; +PFNGLMULTIDRAWARRAYSPROC sf_glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTPROC sf_glad_glMultiDrawArraysIndirect = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC sf_glad_glMultiDrawArraysIndirectCount = NULL; +PFNGLMULTIDRAWELEMENTSPROC sf_glad_glMultiDrawElements = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC sf_glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTPROC sf_glad_glMultiDrawElementsIndirect = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC sf_glad_glMultiDrawElementsIndirectCount = NULL; PFNGLMULTITEXCOORD1DPROC sf_glad_glMultiTexCoord1d = NULL; PFNGLMULTITEXCOORD1DARBPROC sf_glad_glMultiTexCoord1dARB = NULL; PFNGLMULTITEXCOORD1DVPROC sf_glad_glMultiTexCoord1dv = NULL; @@ -5273,6 +8319,26 @@ PFNGLMULTITEXCOORD4SPROC sf_glad_glMultiTexCoord4s = NULL; PFNGLMULTITEXCOORD4SARBPROC sf_glad_glMultiTexCoord4sARB = NULL; PFNGLMULTITEXCOORD4SVPROC sf_glad_glMultiTexCoord4sv = NULL; PFNGLMULTITEXCOORD4SVARBPROC sf_glad_glMultiTexCoord4svARB = NULL; +PFNGLMULTITEXCOORDP1UIPROC sf_glad_glMultiTexCoordP1ui = NULL; +PFNGLMULTITEXCOORDP1UIVPROC sf_glad_glMultiTexCoordP1uiv = NULL; +PFNGLMULTITEXCOORDP2UIPROC sf_glad_glMultiTexCoordP2ui = NULL; +PFNGLMULTITEXCOORDP2UIVPROC sf_glad_glMultiTexCoordP2uiv = NULL; +PFNGLMULTITEXCOORDP3UIPROC sf_glad_glMultiTexCoordP3ui = NULL; +PFNGLMULTITEXCOORDP3UIVPROC sf_glad_glMultiTexCoordP3uiv = NULL; +PFNGLMULTITEXCOORDP4UIPROC sf_glad_glMultiTexCoordP4ui = NULL; +PFNGLMULTITEXCOORDP4UIVPROC sf_glad_glMultiTexCoordP4uiv = NULL; +PFNGLNAMEDBUFFERDATAPROC sf_glad_glNamedBufferData = NULL; +PFNGLNAMEDBUFFERSTORAGEPROC sf_glad_glNamedBufferStorage = NULL; +PFNGLNAMEDBUFFERSUBDATAPROC sf_glad_glNamedBufferSubData = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC sf_glad_glNamedFramebufferDrawBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC sf_glad_glNamedFramebufferDrawBuffers = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC sf_glad_glNamedFramebufferParameteri = NULL; +PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC sf_glad_glNamedFramebufferReadBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC sf_glad_glNamedFramebufferRenderbuffer = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREPROC sf_glad_glNamedFramebufferTexture = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC sf_glad_glNamedFramebufferTextureLayer = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEPROC sf_glad_glNamedRenderbufferStorage = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC sf_glad_glNamedRenderbufferStorageMultisample = NULL; PFNGLNEWLISTPROC sf_glad_glNewList = NULL; PFNGLNORMAL3BPROC sf_glad_glNormal3b = NULL; PFNGLNORMAL3BVPROC sf_glad_glNormal3bv = NULL; @@ -5284,12 +8350,18 @@ PFNGLNORMAL3IPROC sf_glad_glNormal3i = NULL; PFNGLNORMAL3IVPROC sf_glad_glNormal3iv = NULL; PFNGLNORMAL3SPROC sf_glad_glNormal3s = NULL; PFNGLNORMAL3SVPROC sf_glad_glNormal3sv = NULL; +PFNGLNORMALP3UIPROC sf_glad_glNormalP3ui = NULL; +PFNGLNORMALP3UIVPROC sf_glad_glNormalP3uiv = NULL; PFNGLNORMALPOINTERPROC sf_glad_glNormalPointer = NULL; PFNGLNORMALPOINTEREXTPROC sf_glad_glNormalPointerEXT = NULL; PFNGLOBJECTLABELPROC sf_glad_glObjectLabel = NULL; PFNGLOBJECTPTRLABELPROC sf_glad_glObjectPtrLabel = NULL; PFNGLORTHOPROC sf_glad_glOrtho = NULL; +PFNGLORTHOFOESPROC sf_glad_glOrthofOES = NULL; PFNGLPASSTHROUGHPROC sf_glad_glPassThrough = NULL; +PFNGLPATCHPARAMETERFVPROC sf_glad_glPatchParameterfv = NULL; +PFNGLPATCHPARAMETERIPROC sf_glad_glPatchParameteri = NULL; +PFNGLPAUSETRANSFORMFEEDBACKPROC sf_glad_glPauseTransformFeedback = NULL; PFNGLPIXELMAPFVPROC sf_glad_glPixelMapfv = NULL; PFNGLPIXELMAPUIVPROC sf_glad_glPixelMapuiv = NULL; PFNGLPIXELMAPUSVPROC sf_glad_glPixelMapusv = NULL; @@ -5298,15 +8370,21 @@ PFNGLPIXELSTOREIPROC sf_glad_glPixelStorei = NULL; PFNGLPIXELTRANSFERFPROC sf_glad_glPixelTransferf = NULL; PFNGLPIXELTRANSFERIPROC sf_glad_glPixelTransferi = NULL; PFNGLPIXELZOOMPROC sf_glad_glPixelZoom = NULL; +PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC sf_glad_glPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC sf_glad_glPointParameteriv = NULL; PFNGLPOINTSIZEPROC sf_glad_glPointSize = NULL; PFNGLPOLYGONMODEPROC sf_glad_glPolygonMode = NULL; PFNGLPOLYGONOFFSETPROC sf_glad_glPolygonOffset = NULL; +PFNGLPOLYGONOFFSETCLAMPPROC sf_glad_glPolygonOffsetClamp = NULL; PFNGLPOLYGONSTIPPLEPROC sf_glad_glPolygonStipple = NULL; PFNGLPOPATTRIBPROC sf_glad_glPopAttrib = NULL; PFNGLPOPCLIENTATTRIBPROC sf_glad_glPopClientAttrib = NULL; PFNGLPOPDEBUGGROUPPROC sf_glad_glPopDebugGroup = NULL; PFNGLPOPMATRIXPROC sf_glad_glPopMatrix = NULL; PFNGLPOPNAMEPROC sf_glad_glPopName = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC sf_glad_glPrimitiveRestartIndex = NULL; PFNGLPRIORITIZETEXTURESPROC sf_glad_glPrioritizeTextures = NULL; PFNGLPRIORITIZETEXTURESEXTPROC sf_glad_glPrioritizeTexturesEXT = NULL; PFNGLPROGRAMBINARYPROC sf_glad_glProgramBinary = NULL; @@ -5379,11 +8457,13 @@ PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC sf_glad_glProgramUniformMatrix4x2fv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC sf_glad_glProgramUniformMatrix4x3dv = NULL; PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC sf_glad_glProgramUniformMatrix4x3fv = NULL; PFNGLPROGRAMVERTEXLIMITNVPROC sf_glad_glProgramVertexLimitNV = NULL; +PFNGLPROVOKINGVERTEXPROC sf_glad_glProvokingVertex = NULL; PFNGLPUSHATTRIBPROC sf_glad_glPushAttrib = NULL; PFNGLPUSHCLIENTATTRIBPROC sf_glad_glPushClientAttrib = NULL; PFNGLPUSHDEBUGGROUPPROC sf_glad_glPushDebugGroup = NULL; PFNGLPUSHMATRIXPROC sf_glad_glPushMatrix = NULL; PFNGLPUSHNAMEPROC sf_glad_glPushName = NULL; +PFNGLQUERYCOUNTERPROC sf_glad_glQueryCounter = NULL; PFNGLRASTERPOS2DPROC sf_glad_glRasterPos2d = NULL; PFNGLRASTERPOS2DVPROC sf_glad_glRasterPos2dv = NULL; PFNGLRASTERPOS2FPROC sf_glad_glRasterPos2f = NULL; @@ -5410,6 +8490,7 @@ PFNGLRASTERPOS4SPROC sf_glad_glRasterPos4s = NULL; PFNGLRASTERPOS4SVPROC sf_glad_glRasterPos4sv = NULL; PFNGLREADBUFFERPROC sf_glad_glReadBuffer = NULL; PFNGLREADPIXELSPROC sf_glad_glReadPixels = NULL; +PFNGLREADNPIXELSPROC sf_glad_glReadnPixels = NULL; PFNGLRECTDPROC sf_glad_glRectd = NULL; PFNGLRECTDVPROC sf_glad_glRectdv = NULL; PFNGLRECTFPROC sf_glad_glRectf = NULL; @@ -5418,6 +8499,7 @@ PFNGLRECTIPROC sf_glad_glRecti = NULL; PFNGLRECTIVPROC sf_glad_glRectiv = NULL; PFNGLRECTSPROC sf_glad_glRects = NULL; PFNGLRECTSVPROC sf_glad_glRectsv = NULL; +PFNGLRELEASESHADERCOMPILERPROC sf_glad_glReleaseShaderCompiler = NULL; PFNGLRENDERMODEPROC sf_glad_glRenderMode = NULL; PFNGLRENDERBUFFERSTORAGEPROC sf_glad_glRenderbufferStorage = NULL; PFNGLRENDERBUFFERSTORAGEEXTPROC sf_glad_glRenderbufferStorageEXT = NULL; @@ -5426,19 +8508,58 @@ PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC sf_glad_glRenderbufferStorageMultisam PFNGLREQUESTRESIDENTPROGRAMSNVPROC sf_glad_glRequestResidentProgramsNV = NULL; PFNGLRESETHISTOGRAMPROC sf_glad_glResetHistogram = NULL; PFNGLRESETMINMAXPROC sf_glad_glResetMinmax = NULL; +PFNGLRESUMETRANSFORMFEEDBACKPROC sf_glad_glResumeTransformFeedback = NULL; PFNGLROTATEDPROC sf_glad_glRotated = NULL; PFNGLROTATEFPROC sf_glad_glRotatef = NULL; +PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage = NULL; +PFNGLSAMPLEMASKIPROC sf_glad_glSampleMaski = NULL; +PFNGLSAMPLERPARAMETERIIVPROC sf_glad_glSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC sf_glad_glSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC sf_glad_glSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC sf_glad_glSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC sf_glad_glSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC sf_glad_glSamplerParameteriv = NULL; PFNGLSCALEDPROC sf_glad_glScaled = NULL; PFNGLSCALEFPROC sf_glad_glScalef = NULL; PFNGLSCISSORPROC sf_glad_glScissor = NULL; +PFNGLSCISSORARRAYVPROC sf_glad_glScissorArrayv = NULL; +PFNGLSCISSORINDEXEDPROC sf_glad_glScissorIndexed = NULL; +PFNGLSCISSORINDEXEDVPROC sf_glad_glScissorIndexedv = NULL; +PFNGLSECONDARYCOLOR3BPROC sf_glad_glSecondaryColor3b = NULL; +PFNGLSECONDARYCOLOR3BVPROC sf_glad_glSecondaryColor3bv = NULL; +PFNGLSECONDARYCOLOR3DPROC sf_glad_glSecondaryColor3d = NULL; +PFNGLSECONDARYCOLOR3DVPROC sf_glad_glSecondaryColor3dv = NULL; +PFNGLSECONDARYCOLOR3FPROC sf_glad_glSecondaryColor3f = NULL; +PFNGLSECONDARYCOLOR3FVPROC sf_glad_glSecondaryColor3fv = NULL; +PFNGLSECONDARYCOLOR3IPROC sf_glad_glSecondaryColor3i = NULL; +PFNGLSECONDARYCOLOR3IVPROC sf_glad_glSecondaryColor3iv = NULL; +PFNGLSECONDARYCOLOR3SPROC sf_glad_glSecondaryColor3s = NULL; +PFNGLSECONDARYCOLOR3SVPROC sf_glad_glSecondaryColor3sv = NULL; +PFNGLSECONDARYCOLOR3UBPROC sf_glad_glSecondaryColor3ub = NULL; +PFNGLSECONDARYCOLOR3UBVPROC sf_glad_glSecondaryColor3ubv = NULL; +PFNGLSECONDARYCOLOR3UIPROC sf_glad_glSecondaryColor3ui = NULL; +PFNGLSECONDARYCOLOR3UIVPROC sf_glad_glSecondaryColor3uiv = NULL; +PFNGLSECONDARYCOLOR3USPROC sf_glad_glSecondaryColor3us = NULL; +PFNGLSECONDARYCOLOR3USVPROC sf_glad_glSecondaryColor3usv = NULL; +PFNGLSECONDARYCOLORP3UIPROC sf_glad_glSecondaryColorP3ui = NULL; +PFNGLSECONDARYCOLORP3UIVPROC sf_glad_glSecondaryColorP3uiv = NULL; +PFNGLSECONDARYCOLORPOINTERPROC sf_glad_glSecondaryColorPointer = NULL; PFNGLSELECTBUFFERPROC sf_glad_glSelectBuffer = NULL; PFNGLSEPARABLEFILTER2DPROC sf_glad_glSeparableFilter2D = NULL; PFNGLSHADEMODELPROC sf_glad_glShadeModel = NULL; +PFNGLSHADERBINARYPROC sf_glad_glShaderBinary = NULL; PFNGLSHADERSOURCEPROC sf_glad_glShaderSource = NULL; PFNGLSHADERSOURCEARBPROC sf_glad_glShaderSourceARB = NULL; +PFNGLSHADERSTORAGEBLOCKBINDINGPROC sf_glad_glShaderStorageBlockBinding = NULL; +PFNGLSPECIALIZESHADERPROC sf_glad_glSpecializeShader = NULL; PFNGLSTENCILFUNCPROC sf_glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC sf_glad_glStencilFuncSeparate = NULL; PFNGLSTENCILMASKPROC sf_glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC sf_glad_glStencilMaskSeparate = NULL; PFNGLSTENCILOPPROC sf_glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC sf_glad_glStencilOpSeparate = NULL; +PFNGLTEXBUFFERPROC sf_glad_glTexBuffer = NULL; +PFNGLTEXBUFFERRANGEPROC sf_glad_glTexBufferRange = NULL; PFNGLTEXCOORD1DPROC sf_glad_glTexCoord1d = NULL; PFNGLTEXCOORD1DVPROC sf_glad_glTexCoord1dv = NULL; PFNGLTEXCOORD1FPROC sf_glad_glTexCoord1f = NULL; @@ -5471,6 +8592,14 @@ PFNGLTEXCOORD4IPROC sf_glad_glTexCoord4i = NULL; PFNGLTEXCOORD4IVPROC sf_glad_glTexCoord4iv = NULL; PFNGLTEXCOORD4SPROC sf_glad_glTexCoord4s = NULL; PFNGLTEXCOORD4SVPROC sf_glad_glTexCoord4sv = NULL; +PFNGLTEXCOORDP1UIPROC sf_glad_glTexCoordP1ui = NULL; +PFNGLTEXCOORDP1UIVPROC sf_glad_glTexCoordP1uiv = NULL; +PFNGLTEXCOORDP2UIPROC sf_glad_glTexCoordP2ui = NULL; +PFNGLTEXCOORDP2UIVPROC sf_glad_glTexCoordP2uiv = NULL; +PFNGLTEXCOORDP3UIPROC sf_glad_glTexCoordP3ui = NULL; +PFNGLTEXCOORDP3UIVPROC sf_glad_glTexCoordP3uiv = NULL; +PFNGLTEXCOORDP4UIPROC sf_glad_glTexCoordP4ui = NULL; +PFNGLTEXCOORDP4UIVPROC sf_glad_glTexCoordP4uiv = NULL; PFNGLTEXCOORDPOINTERPROC sf_glad_glTexCoordPointer = NULL; PFNGLTEXCOORDPOINTEREXTPROC sf_glad_glTexCoordPointerEXT = NULL; PFNGLTEXENVFPROC sf_glad_glTexEnvf = NULL; @@ -5485,17 +8614,51 @@ PFNGLTEXGENIPROC sf_glad_glTexGeni = NULL; PFNGLTEXGENIVPROC sf_glad_glTexGeniv = NULL; PFNGLTEXIMAGE1DPROC sf_glad_glTexImage1D = NULL; PFNGLTEXIMAGE2DPROC sf_glad_glTexImage2D = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC sf_glad_glTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DPROC sf_glad_glTexImage3D = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC sf_glad_glTexImage3DMultisample = NULL; +PFNGLTEXPARAMETERIIVPROC sf_glad_glTexParameterIiv = NULL; +PFNGLTEXPARAMETERIUIVPROC sf_glad_glTexParameterIuiv = NULL; PFNGLTEXPARAMETERFPROC sf_glad_glTexParameterf = NULL; PFNGLTEXPARAMETERFVPROC sf_glad_glTexParameterfv = NULL; PFNGLTEXPARAMETERIPROC sf_glad_glTexParameteri = NULL; PFNGLTEXPARAMETERIVPROC sf_glad_glTexParameteriv = NULL; +PFNGLTEXSTORAGE1DPROC sf_glad_glTexStorage1D = NULL; +PFNGLTEXSTORAGE2DPROC sf_glad_glTexStorage2D = NULL; +PFNGLTEXSTORAGE2DMULTISAMPLEPROC sf_glad_glTexStorage2DMultisample = NULL; +PFNGLTEXSTORAGE3DPROC sf_glad_glTexStorage3D = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC sf_glad_glTexStorage3DMultisample = NULL; PFNGLTEXSUBIMAGE1DPROC sf_glad_glTexSubImage1D = NULL; PFNGLTEXSUBIMAGE1DEXTPROC sf_glad_glTexSubImage1DEXT = NULL; PFNGLTEXSUBIMAGE2DPROC sf_glad_glTexSubImage2D = NULL; PFNGLTEXSUBIMAGE2DEXTPROC sf_glad_glTexSubImage2DEXT = NULL; +PFNGLTEXSUBIMAGE3DPROC sf_glad_glTexSubImage3D = NULL; +PFNGLTEXTUREBARRIERPROC sf_glad_glTextureBarrier = NULL; +PFNGLTEXTUREBUFFERPROC sf_glad_glTextureBuffer = NULL; +PFNGLTEXTUREBUFFERRANGEPROC sf_glad_glTextureBufferRange = NULL; +PFNGLTEXTUREPARAMETERIIVPROC sf_glad_glTextureParameterIiv = NULL; +PFNGLTEXTUREPARAMETERIUIVPROC sf_glad_glTextureParameterIuiv = NULL; +PFNGLTEXTUREPARAMETERFPROC sf_glad_glTextureParameterf = NULL; +PFNGLTEXTUREPARAMETERFVPROC sf_glad_glTextureParameterfv = NULL; +PFNGLTEXTUREPARAMETERIPROC sf_glad_glTextureParameteri = NULL; +PFNGLTEXTUREPARAMETERIVPROC sf_glad_glTextureParameteriv = NULL; +PFNGLTEXTURESTORAGE1DPROC sf_glad_glTextureStorage1D = NULL; +PFNGLTEXTURESTORAGE2DPROC sf_glad_glTextureStorage2D = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC sf_glad_glTextureStorage2DMultisample = NULL; +PFNGLTEXTURESTORAGE3DPROC sf_glad_glTextureStorage3D = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC sf_glad_glTextureStorage3DMultisample = NULL; +PFNGLTEXTURESUBIMAGE1DPROC sf_glad_glTextureSubImage1D = NULL; +PFNGLTEXTURESUBIMAGE2DPROC sf_glad_glTextureSubImage2D = NULL; +PFNGLTEXTURESUBIMAGE3DPROC sf_glad_glTextureSubImage3D = NULL; +PFNGLTEXTUREVIEWPROC sf_glad_glTextureView = NULL; PFNGLTRACKMATRIXNVPROC sf_glad_glTrackMatrixNV = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC sf_glad_glTransformFeedbackBufferBase = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC sf_glad_glTransformFeedbackBufferRange = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC sf_glad_glTransformFeedbackVaryings = NULL; PFNGLTRANSLATEDPROC sf_glad_glTranslated = NULL; PFNGLTRANSLATEFPROC sf_glad_glTranslatef = NULL; +PFNGLUNIFORM1DPROC sf_glad_glUniform1d = NULL; +PFNGLUNIFORM1DVPROC sf_glad_glUniform1dv = NULL; PFNGLUNIFORM1FPROC sf_glad_glUniform1f = NULL; PFNGLUNIFORM1FARBPROC sf_glad_glUniform1fARB = NULL; PFNGLUNIFORM1FVPROC sf_glad_glUniform1fv = NULL; @@ -5504,6 +8667,10 @@ PFNGLUNIFORM1IPROC sf_glad_glUniform1i = NULL; PFNGLUNIFORM1IARBPROC sf_glad_glUniform1iARB = NULL; PFNGLUNIFORM1IVPROC sf_glad_glUniform1iv = NULL; PFNGLUNIFORM1IVARBPROC sf_glad_glUniform1ivARB = NULL; +PFNGLUNIFORM1UIPROC sf_glad_glUniform1ui = NULL; +PFNGLUNIFORM1UIVPROC sf_glad_glUniform1uiv = NULL; +PFNGLUNIFORM2DPROC sf_glad_glUniform2d = NULL; +PFNGLUNIFORM2DVPROC sf_glad_glUniform2dv = NULL; PFNGLUNIFORM2FPROC sf_glad_glUniform2f = NULL; PFNGLUNIFORM2FARBPROC sf_glad_glUniform2fARB = NULL; PFNGLUNIFORM2FVPROC sf_glad_glUniform2fv = NULL; @@ -5512,6 +8679,10 @@ PFNGLUNIFORM2IPROC sf_glad_glUniform2i = NULL; PFNGLUNIFORM2IARBPROC sf_glad_glUniform2iARB = NULL; PFNGLUNIFORM2IVPROC sf_glad_glUniform2iv = NULL; PFNGLUNIFORM2IVARBPROC sf_glad_glUniform2ivARB = NULL; +PFNGLUNIFORM2UIPROC sf_glad_glUniform2ui = NULL; +PFNGLUNIFORM2UIVPROC sf_glad_glUniform2uiv = NULL; +PFNGLUNIFORM3DPROC sf_glad_glUniform3d = NULL; +PFNGLUNIFORM3DVPROC sf_glad_glUniform3dv = NULL; PFNGLUNIFORM3FPROC sf_glad_glUniform3f = NULL; PFNGLUNIFORM3FARBPROC sf_glad_glUniform3fARB = NULL; PFNGLUNIFORM3FVPROC sf_glad_glUniform3fv = NULL; @@ -5520,6 +8691,10 @@ PFNGLUNIFORM3IPROC sf_glad_glUniform3i = NULL; PFNGLUNIFORM3IARBPROC sf_glad_glUniform3iARB = NULL; PFNGLUNIFORM3IVPROC sf_glad_glUniform3iv = NULL; PFNGLUNIFORM3IVARBPROC sf_glad_glUniform3ivARB = NULL; +PFNGLUNIFORM3UIPROC sf_glad_glUniform3ui = NULL; +PFNGLUNIFORM3UIVPROC sf_glad_glUniform3uiv = NULL; +PFNGLUNIFORM4DPROC sf_glad_glUniform4d = NULL; +PFNGLUNIFORM4DVPROC sf_glad_glUniform4dv = NULL; PFNGLUNIFORM4FPROC sf_glad_glUniform4f = NULL; PFNGLUNIFORM4FARBPROC sf_glad_glUniform4fARB = NULL; PFNGLUNIFORM4FVPROC sf_glad_glUniform4fv = NULL; @@ -5528,14 +8703,34 @@ PFNGLUNIFORM4IPROC sf_glad_glUniform4i = NULL; PFNGLUNIFORM4IARBPROC sf_glad_glUniform4iARB = NULL; PFNGLUNIFORM4IVPROC sf_glad_glUniform4iv = NULL; PFNGLUNIFORM4IVARBPROC sf_glad_glUniform4ivARB = NULL; +PFNGLUNIFORM4UIPROC sf_glad_glUniform4ui = NULL; +PFNGLUNIFORM4UIVPROC sf_glad_glUniform4uiv = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC sf_glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMMATRIX2DVPROC sf_glad_glUniformMatrix2dv = NULL; PFNGLUNIFORMMATRIX2FVPROC sf_glad_glUniformMatrix2fv = NULL; PFNGLUNIFORMMATRIX2FVARBPROC sf_glad_glUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX2X3DVPROC sf_glad_glUniformMatrix2x3dv = NULL; +PFNGLUNIFORMMATRIX2X3FVPROC sf_glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4DVPROC sf_glad_glUniformMatrix2x4dv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC sf_glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3DVPROC sf_glad_glUniformMatrix3dv = NULL; PFNGLUNIFORMMATRIX3FVPROC sf_glad_glUniformMatrix3fv = NULL; PFNGLUNIFORMMATRIX3FVARBPROC sf_glad_glUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX3X2DVPROC sf_glad_glUniformMatrix3x2dv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC sf_glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4DVPROC sf_glad_glUniformMatrix3x4dv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC sf_glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4DVPROC sf_glad_glUniformMatrix4dv = NULL; PFNGLUNIFORMMATRIX4FVPROC sf_glad_glUniformMatrix4fv = NULL; PFNGLUNIFORMMATRIX4FVARBPROC sf_glad_glUniformMatrix4fvARB = NULL; +PFNGLUNIFORMMATRIX4X2DVPROC sf_glad_glUniformMatrix4x2dv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC sf_glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3DVPROC sf_glad_glUniformMatrix4x3dv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC sf_glad_glUniformMatrix4x3fv = NULL; +PFNGLUNIFORMSUBROUTINESUIVPROC sf_glad_glUniformSubroutinesuiv = NULL; PFNGLUNMAPBUFFERPROC sf_glad_glUnmapBuffer = NULL; PFNGLUNMAPBUFFERARBPROC sf_glad_glUnmapBufferARB = NULL; +PFNGLUNMAPNAMEDBUFFERPROC sf_glad_glUnmapNamedBuffer = NULL; PFNGLUSEPROGRAMPROC sf_glad_glUseProgram = NULL; PFNGLUSEPROGRAMOBJECTARBPROC sf_glad_glUseProgramObjectARB = NULL; PFNGLUSEPROGRAMSTAGESPROC sf_glad_glUseProgramStages = NULL; @@ -5566,6 +8761,14 @@ PFNGLVERTEX4IPROC sf_glad_glVertex4i = NULL; PFNGLVERTEX4IVPROC sf_glad_glVertex4iv = NULL; PFNGLVERTEX4SPROC sf_glad_glVertex4s = NULL; PFNGLVERTEX4SVPROC sf_glad_glVertex4sv = NULL; +PFNGLVERTEXARRAYATTRIBBINDINGPROC sf_glad_glVertexArrayAttribBinding = NULL; +PFNGLVERTEXARRAYATTRIBFORMATPROC sf_glad_glVertexArrayAttribFormat = NULL; +PFNGLVERTEXARRAYATTRIBIFORMATPROC sf_glad_glVertexArrayAttribIFormat = NULL; +PFNGLVERTEXARRAYATTRIBLFORMATPROC sf_glad_glVertexArrayAttribLFormat = NULL; +PFNGLVERTEXARRAYBINDINGDIVISORPROC sf_glad_glVertexArrayBindingDivisor = NULL; +PFNGLVERTEXARRAYELEMENTBUFFERPROC sf_glad_glVertexArrayElementBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERPROC sf_glad_glVertexArrayVertexBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERSPROC sf_glad_glVertexArrayVertexBuffers = NULL; PFNGLVERTEXATTRIB1DPROC sf_glad_glVertexAttrib1d = NULL; PFNGLVERTEXATTRIB1DARBPROC sf_glad_glVertexAttrib1dARB = NULL; PFNGLVERTEXATTRIB1DNVPROC sf_glad_glVertexAttrib1dNV = NULL; @@ -5664,6 +8867,49 @@ PFNGLVERTEXATTRIB4UIVPROC sf_glad_glVertexAttrib4uiv = NULL; PFNGLVERTEXATTRIB4UIVARBPROC sf_glad_glVertexAttrib4uivARB = NULL; PFNGLVERTEXATTRIB4USVPROC sf_glad_glVertexAttrib4usv = NULL; PFNGLVERTEXATTRIB4USVARBPROC sf_glad_glVertexAttrib4usvARB = NULL; +PFNGLVERTEXATTRIBBINDINGPROC sf_glad_glVertexAttribBinding = NULL; +PFNGLVERTEXATTRIBDIVISORPROC sf_glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBFORMATPROC sf_glad_glVertexAttribFormat = NULL; +PFNGLVERTEXATTRIBI1IPROC sf_glad_glVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IVPROC sf_glad_glVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1UIPROC sf_glad_glVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIVPROC sf_glad_glVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI2IPROC sf_glad_glVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IVPROC sf_glad_glVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2UIPROC sf_glad_glVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIVPROC sf_glad_glVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI3IPROC sf_glad_glVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IVPROC sf_glad_glVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3UIPROC sf_glad_glVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIVPROC sf_glad_glVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI4BVPROC sf_glad_glVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4IPROC sf_glad_glVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IVPROC sf_glad_glVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4SVPROC sf_glad_glVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4UBVPROC sf_glad_glVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UIPROC sf_glad_glVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIVPROC sf_glad_glVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4USVPROC sf_glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIFORMATPROC sf_glad_glVertexAttribIFormat = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC sf_glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBL1DPROC sf_glad_glVertexAttribL1d = NULL; +PFNGLVERTEXATTRIBL1DVPROC sf_glad_glVertexAttribL1dv = NULL; +PFNGLVERTEXATTRIBL2DPROC sf_glad_glVertexAttribL2d = NULL; +PFNGLVERTEXATTRIBL2DVPROC sf_glad_glVertexAttribL2dv = NULL; +PFNGLVERTEXATTRIBL3DPROC sf_glad_glVertexAttribL3d = NULL; +PFNGLVERTEXATTRIBL3DVPROC sf_glad_glVertexAttribL3dv = NULL; +PFNGLVERTEXATTRIBL4DPROC sf_glad_glVertexAttribL4d = NULL; +PFNGLVERTEXATTRIBL4DVPROC sf_glad_glVertexAttribL4dv = NULL; +PFNGLVERTEXATTRIBLFORMATPROC sf_glad_glVertexAttribLFormat = NULL; +PFNGLVERTEXATTRIBLPOINTERPROC sf_glad_glVertexAttribLPointer = NULL; +PFNGLVERTEXATTRIBP1UIPROC sf_glad_glVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC sf_glad_glVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC sf_glad_glVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC sf_glad_glVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC sf_glad_glVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC sf_glad_glVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC sf_glad_glVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC sf_glad_glVertexAttribP4uiv = NULL; PFNGLVERTEXATTRIBPOINTERPROC sf_glad_glVertexAttribPointer = NULL; PFNGLVERTEXATTRIBPOINTERARBPROC sf_glad_glVertexAttribPointerARB = NULL; PFNGLVERTEXATTRIBPOINTERNVPROC sf_glad_glVertexAttribPointerNV = NULL; @@ -5680,9 +8926,36 @@ PFNGLVERTEXATTRIBS4DVNVPROC sf_glad_glVertexAttribs4dvNV = NULL; PFNGLVERTEXATTRIBS4FVNVPROC sf_glad_glVertexAttribs4fvNV = NULL; PFNGLVERTEXATTRIBS4SVNVPROC sf_glad_glVertexAttribs4svNV = NULL; PFNGLVERTEXATTRIBS4UBVNVPROC sf_glad_glVertexAttribs4ubvNV = NULL; +PFNGLVERTEXBINDINGDIVISORPROC sf_glad_glVertexBindingDivisor = NULL; +PFNGLVERTEXP2UIPROC sf_glad_glVertexP2ui = NULL; +PFNGLVERTEXP2UIVPROC sf_glad_glVertexP2uiv = NULL; +PFNGLVERTEXP3UIPROC sf_glad_glVertexP3ui = NULL; +PFNGLVERTEXP3UIVPROC sf_glad_glVertexP3uiv = NULL; +PFNGLVERTEXP4UIPROC sf_glad_glVertexP4ui = NULL; +PFNGLVERTEXP4UIVPROC sf_glad_glVertexP4uiv = NULL; PFNGLVERTEXPOINTERPROC sf_glad_glVertexPointer = NULL; PFNGLVERTEXPOINTEREXTPROC sf_glad_glVertexPointerEXT = NULL; PFNGLVIEWPORTPROC sf_glad_glViewport = NULL; +PFNGLVIEWPORTARRAYVPROC sf_glad_glViewportArrayv = NULL; +PFNGLVIEWPORTINDEXEDFPROC sf_glad_glViewportIndexedf = NULL; +PFNGLVIEWPORTINDEXEDFVPROC sf_glad_glViewportIndexedfv = NULL; +PFNGLWAITSYNCPROC sf_glad_glWaitSync = NULL; +PFNGLWINDOWPOS2DPROC sf_glad_glWindowPos2d = NULL; +PFNGLWINDOWPOS2DVPROC sf_glad_glWindowPos2dv = NULL; +PFNGLWINDOWPOS2FPROC sf_glad_glWindowPos2f = NULL; +PFNGLWINDOWPOS2FVPROC sf_glad_glWindowPos2fv = NULL; +PFNGLWINDOWPOS2IPROC sf_glad_glWindowPos2i = NULL; +PFNGLWINDOWPOS2IVPROC sf_glad_glWindowPos2iv = NULL; +PFNGLWINDOWPOS2SPROC sf_glad_glWindowPos2s = NULL; +PFNGLWINDOWPOS2SVPROC sf_glad_glWindowPos2sv = NULL; +PFNGLWINDOWPOS3DPROC sf_glad_glWindowPos3d = NULL; +PFNGLWINDOWPOS3DVPROC sf_glad_glWindowPos3dv = NULL; +PFNGLWINDOWPOS3FPROC sf_glad_glWindowPos3f = NULL; +PFNGLWINDOWPOS3FVPROC sf_glad_glWindowPos3fv = NULL; +PFNGLWINDOWPOS3IPROC sf_glad_glWindowPos3i = NULL; +PFNGLWINDOWPOS3IVPROC sf_glad_glWindowPos3iv = NULL; +PFNGLWINDOWPOS3SPROC sf_glad_glWindowPos3s = NULL; +PFNGLWINDOWPOS3SVPROC sf_glad_glWindowPos3sv = NULL; PFNGLALPHAFUNCXPROC sf_glad_glAlphaFuncx = NULL; PFNGLBINDFRAMEBUFFEROESPROC sf_glad_glBindFramebufferOES = NULL; PFNGLBINDRENDERBUFFEROESPROC sf_glad_glBindRenderbufferOES = NULL; @@ -5691,32 +8964,23 @@ PFNGLBLENDEQUATIONSEPARATEOESPROC sf_glad_glBlendEquationSeparateOES = NULL; PFNGLBLENDFUNCSEPARATEOESPROC sf_glad_glBlendFuncSeparateOES = NULL; PFNGLCHECKFRAMEBUFFERSTATUSOESPROC sf_glad_glCheckFramebufferStatusOES = NULL; PFNGLCLEARCOLORXPROC sf_glad_glClearColorx = NULL; -PFNGLCLEARDEPTHFPROC sf_glad_glClearDepthf = NULL; -PFNGLCLEARDEPTHFOESPROC sf_glad_glClearDepthfOES = NULL; PFNGLCLEARDEPTHXPROC sf_glad_glClearDepthx = NULL; PFNGLCLIPPLANEFPROC sf_glad_glClipPlanef = NULL; -PFNGLCLIPPLANEFOESPROC sf_glad_glClipPlanefOES = NULL; PFNGLCLIPPLANEXPROC sf_glad_glClipPlanex = NULL; PFNGLCOLOR4XPROC sf_glad_glColor4x = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC sf_glad_glCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC sf_glad_glCompressedTexSubImage2D = NULL; PFNGLDELETEFRAMEBUFFERSOESPROC sf_glad_glDeleteFramebuffersOES = NULL; PFNGLDELETERENDERBUFFERSOESPROC sf_glad_glDeleteRenderbuffersOES = NULL; -PFNGLDEPTHRANGEFPROC sf_glad_glDepthRangef = NULL; -PFNGLDEPTHRANGEFOESPROC sf_glad_glDepthRangefOES = NULL; PFNGLDEPTHRANGEXPROC sf_glad_glDepthRangex = NULL; PFNGLFOGXPROC sf_glad_glFogx = NULL; PFNGLFOGXVPROC sf_glad_glFogxv = NULL; PFNGLFRAMEBUFFERRENDERBUFFEROESPROC sf_glad_glFramebufferRenderbufferOES = NULL; PFNGLFRAMEBUFFERTEXTURE2DOESPROC sf_glad_glFramebufferTexture2DOES = NULL; PFNGLFRUSTUMFPROC sf_glad_glFrustumf = NULL; -PFNGLFRUSTUMFOESPROC sf_glad_glFrustumfOES = NULL; PFNGLFRUSTUMXPROC sf_glad_glFrustumx = NULL; PFNGLGENFRAMEBUFFERSOESPROC sf_glad_glGenFramebuffersOES = NULL; PFNGLGENRENDERBUFFERSOESPROC sf_glad_glGenRenderbuffersOES = NULL; PFNGLGENERATEMIPMAPOESPROC sf_glad_glGenerateMipmapOES = NULL; PFNGLGETCLIPPLANEFPROC sf_glad_glGetClipPlanef = NULL; -PFNGLGETCLIPPLANEFOESPROC sf_glad_glGetClipPlanefOES = NULL; PFNGLGETCLIPPLANEXPROC sf_glad_glGetClipPlanex = NULL; PFNGLGETFIXEDVPROC sf_glad_glGetFixedv = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC sf_glad_glGetFramebufferAttachmentParameterivOES = NULL; @@ -5739,17 +9003,13 @@ PFNGLMULTMATRIXXPROC sf_glad_glMultMatrixx = NULL; PFNGLMULTITEXCOORD4XPROC sf_glad_glMultiTexCoord4x = NULL; PFNGLNORMAL3XPROC sf_glad_glNormal3x = NULL; PFNGLORTHOFPROC sf_glad_glOrthof = NULL; -PFNGLORTHOFOESPROC sf_glad_glOrthofOES = NULL; PFNGLORTHOXPROC sf_glad_glOrthox = NULL; -PFNGLPOINTPARAMETERFPROC sf_glad_glPointParameterf = NULL; -PFNGLPOINTPARAMETERFVPROC sf_glad_glPointParameterfv = NULL; PFNGLPOINTPARAMETERXPROC sf_glad_glPointParameterx = NULL; PFNGLPOINTPARAMETERXVPROC sf_glad_glPointParameterxv = NULL; PFNGLPOINTSIZEXPROC sf_glad_glPointSizex = NULL; PFNGLPOLYGONOFFSETXPROC sf_glad_glPolygonOffsetx = NULL; PFNGLRENDERBUFFERSTORAGEOESPROC sf_glad_glRenderbufferStorageOES = NULL; PFNGLROTATEXPROC sf_glad_glRotatex = NULL; -PFNGLSAMPLECOVERAGEPROC sf_glad_glSampleCoverage = NULL; PFNGLSAMPLECOVERAGEXPROC sf_glad_glSampleCoveragex = NULL; PFNGLSCALEXPROC sf_glad_glScalex = NULL; PFNGLTEXENVXPROC sf_glad_glTexEnvx = NULL; @@ -6101,107 +9361,874 @@ static void sf_glad_gl_load_GL_VERSION_1_1( GLADuserptrloadfunc load, void* user sf_glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); sf_glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer"); } -static void sf_glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void* userptr) { - if(!SF_GLAD_GL_VERSION_ES_CM_1_0) return; +static void sf_glad_gl_load_GL_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_1_2) return; + sf_glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); + sf_glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); + sf_glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); + sf_glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); +} +static void sf_glad_gl_load_GL_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_1_3) return; sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); - sf_glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc"); - sf_glad_glAlphaFuncx = (PFNGLALPHAFUNCXPROC) load(userptr, "glAlphaFuncx"); - sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); - sf_glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); - sf_glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); - sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); - sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); - sf_glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); - sf_glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); - sf_glad_glClearColorx = (PFNGLCLEARCOLORXPROC) load(userptr, "glClearColorx"); - sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); - sf_glad_glClearDepthx = (PFNGLCLEARDEPTHXPROC) load(userptr, "glClearDepthx"); - sf_glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture"); - sf_glad_glClipPlanef = (PFNGLCLIPPLANEFPROC) load(userptr, "glClipPlanef"); - sf_glad_glClipPlanex = (PFNGLCLIPPLANEXPROC) load(userptr, "glClipPlanex"); - sf_glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f"); - sf_glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub"); - sf_glad_glColor4x = (PFNGLCOLOR4XPROC) load(userptr, "glColor4x"); - sf_glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); - sf_glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer"); + sf_glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC) load(userptr, "glCompressedTexImage1D"); sf_glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + sf_glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); + sf_glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) load(userptr, "glCompressedTexSubImage1D"); sf_glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); - sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); - sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); - sf_glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + sf_glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); + sf_glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetCompressedTexImage"); + sf_glad_glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC) load(userptr, "glLoadTransposeMatrixd"); + sf_glad_glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC) load(userptr, "glLoadTransposeMatrixf"); + sf_glad_glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC) load(userptr, "glMultTransposeMatrixd"); + sf_glad_glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC) load(userptr, "glMultTransposeMatrixf"); + sf_glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d"); + sf_glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv"); + sf_glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f"); + sf_glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv"); + sf_glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i"); + sf_glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv"); + sf_glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s"); + sf_glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv"); + sf_glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d"); + sf_glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv"); + sf_glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f"); + sf_glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv"); + sf_glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i"); + sf_glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv"); + sf_glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s"); + sf_glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv"); + sf_glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d"); + sf_glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv"); + sf_glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f"); + sf_glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv"); + sf_glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i"); + sf_glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv"); + sf_glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s"); + sf_glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv"); + sf_glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d"); + sf_glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv"); + sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); + sf_glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv"); + sf_glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i"); + sf_glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv"); + sf_glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s"); + sf_glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv"); + sf_glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); +} +static void sf_glad_gl_load_GL_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_1_4) return; + sf_glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); + sf_glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); + sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); + sf_glad_glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC) load(userptr, "glFogCoordPointer"); + sf_glad_glFogCoordd = (PFNGLFOGCOORDDPROC) load(userptr, "glFogCoordd"); + sf_glad_glFogCoorddv = (PFNGLFOGCOORDDVPROC) load(userptr, "glFogCoorddv"); + sf_glad_glFogCoordf = (PFNGLFOGCOORDFPROC) load(userptr, "glFogCoordf"); + sf_glad_glFogCoordfv = (PFNGLFOGCOORDFVPROC) load(userptr, "glFogCoordfv"); + sf_glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC) load(userptr, "glMultiDrawArrays"); + sf_glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC) load(userptr, "glMultiDrawElements"); + sf_glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC) load(userptr, "glPointParameterf"); + sf_glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) load(userptr, "glPointParameterfv"); + sf_glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC) load(userptr, "glPointParameteri"); + sf_glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC) load(userptr, "glPointParameteriv"); + sf_glad_glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC) load(userptr, "glSecondaryColor3b"); + sf_glad_glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC) load(userptr, "glSecondaryColor3bv"); + sf_glad_glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC) load(userptr, "glSecondaryColor3d"); + sf_glad_glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC) load(userptr, "glSecondaryColor3dv"); + sf_glad_glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC) load(userptr, "glSecondaryColor3f"); + sf_glad_glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC) load(userptr, "glSecondaryColor3fv"); + sf_glad_glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC) load(userptr, "glSecondaryColor3i"); + sf_glad_glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC) load(userptr, "glSecondaryColor3iv"); + sf_glad_glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC) load(userptr, "glSecondaryColor3s"); + sf_glad_glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC) load(userptr, "glSecondaryColor3sv"); + sf_glad_glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC) load(userptr, "glSecondaryColor3ub"); + sf_glad_glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC) load(userptr, "glSecondaryColor3ubv"); + sf_glad_glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC) load(userptr, "glSecondaryColor3ui"); + sf_glad_glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC) load(userptr, "glSecondaryColor3uiv"); + sf_glad_glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC) load(userptr, "glSecondaryColor3us"); + sf_glad_glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC) load(userptr, "glSecondaryColor3usv"); + sf_glad_glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC) load(userptr, "glSecondaryColorPointer"); + sf_glad_glWindowPos2d = (PFNGLWINDOWPOS2DPROC) load(userptr, "glWindowPos2d"); + sf_glad_glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC) load(userptr, "glWindowPos2dv"); + sf_glad_glWindowPos2f = (PFNGLWINDOWPOS2FPROC) load(userptr, "glWindowPos2f"); + sf_glad_glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC) load(userptr, "glWindowPos2fv"); + sf_glad_glWindowPos2i = (PFNGLWINDOWPOS2IPROC) load(userptr, "glWindowPos2i"); + sf_glad_glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC) load(userptr, "glWindowPos2iv"); + sf_glad_glWindowPos2s = (PFNGLWINDOWPOS2SPROC) load(userptr, "glWindowPos2s"); + sf_glad_glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC) load(userptr, "glWindowPos2sv"); + sf_glad_glWindowPos3d = (PFNGLWINDOWPOS3DPROC) load(userptr, "glWindowPos3d"); + sf_glad_glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC) load(userptr, "glWindowPos3dv"); + sf_glad_glWindowPos3f = (PFNGLWINDOWPOS3FPROC) load(userptr, "glWindowPos3f"); + sf_glad_glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC) load(userptr, "glWindowPos3fv"); + sf_glad_glWindowPos3i = (PFNGLWINDOWPOS3IPROC) load(userptr, "glWindowPos3i"); + sf_glad_glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC) load(userptr, "glWindowPos3iv"); + sf_glad_glWindowPos3s = (PFNGLWINDOWPOS3SPROC) load(userptr, "glWindowPos3s"); + sf_glad_glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC) load(userptr, "glWindowPos3sv"); +} +static void sf_glad_gl_load_GL_VERSION_1_5( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_1_5) return; + sf_glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); + sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); - sf_glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); - sf_glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); - sf_glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); - sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); - sf_glad_glDepthRangex = (PFNGLDEPTHRANGEXPROC) load(userptr, "glDepthRangex"); - sf_glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); - sf_glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState"); - sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); - sf_glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); - sf_glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); - sf_glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState"); - sf_glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); - sf_glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); - sf_glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf"); - sf_glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv"); - sf_glad_glFogx = (PFNGLFOGXPROC) load(userptr, "glFogx"); - sf_glad_glFogxv = (PFNGLFOGXVPROC) load(userptr, "glFogxv"); - sf_glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); - sf_glad_glFrustumf = (PFNGLFRUSTUMFPROC) load(userptr, "glFrustumf"); - sf_glad_glFrustumx = (PFNGLFRUSTUMXPROC) load(userptr, "glFrustumx"); + sf_glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); + sf_glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); - sf_glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); - sf_glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + sf_glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); - sf_glad_glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC) load(userptr, "glGetClipPlanef"); - sf_glad_glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC) load(userptr, "glGetClipPlanex"); - sf_glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); - sf_glad_glGetFixedv = (PFNGLGETFIXEDVPROC) load(userptr, "glGetFixedv"); - sf_glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); - sf_glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); - sf_glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv"); - sf_glad_glGetLightxv = (PFNGLGETLIGHTXVPROC) load(userptr, "glGetLightxv"); - sf_glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv"); - sf_glad_glGetMaterialxv = (PFNGLGETMATERIALXVPROC) load(userptr, "glGetMaterialxv"); - sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); - sf_glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); - sf_glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv"); - sf_glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv"); - sf_glad_glGetTexEnvxv = (PFNGLGETTEXENVXVPROC) load(userptr, "glGetTexEnvxv"); - sf_glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); - sf_glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); - sf_glad_glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC) load(userptr, "glGetTexParameterxv"); - sf_glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + sf_glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); + sf_glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); + sf_glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC) load(userptr, "glGetQueryObjectiv"); + sf_glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); + sf_glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); sf_glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); - sf_glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); - sf_glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); - sf_glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf"); - sf_glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv"); - sf_glad_glLightModelx = (PFNGLLIGHTMODELXPROC) load(userptr, "glLightModelx"); - sf_glad_glLightModelxv = (PFNGLLIGHTMODELXVPROC) load(userptr, "glLightModelxv"); - sf_glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf"); - sf_glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv"); - sf_glad_glLightx = (PFNGLLIGHTXPROC) load(userptr, "glLightx"); - sf_glad_glLightxv = (PFNGLLIGHTXVPROC) load(userptr, "glLightxv"); - sf_glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); - sf_glad_glLineWidthx = (PFNGLLINEWIDTHXPROC) load(userptr, "glLineWidthx"); - sf_glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity"); - sf_glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf"); - sf_glad_glLoadMatrixx = (PFNGLLOADMATRIXXPROC) load(userptr, "glLoadMatrixx"); - sf_glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); - sf_glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf"); - sf_glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv"); - sf_glad_glMaterialx = (PFNGLMATERIALXPROC) load(userptr, "glMaterialx"); - sf_glad_glMaterialxv = (PFNGLMATERIALXVPROC) load(userptr, "glMaterialxv"); - sf_glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode"); - sf_glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf"); - sf_glad_glMultMatrixx = (PFNGLMULTMATRIXXPROC) load(userptr, "glMultMatrixx"); - sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); - sf_glad_glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC) load(userptr, "glMultiTexCoord4x"); - sf_glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f"); - sf_glad_glNormal3x = (PFNGLNORMAL3XPROC) load(userptr, "glNormal3x"); + sf_glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); + sf_glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); + sf_glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); +} +static void sf_glad_gl_load_GL_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_2_0) return; + sf_glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); + sf_glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); + sf_glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); + sf_glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); + sf_glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); + sf_glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); + sf_glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); + sf_glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); + sf_glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); + sf_glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); + sf_glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); + sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); + sf_glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); + sf_glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); + sf_glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); + sf_glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); + sf_glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); + sf_glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); + sf_glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); + sf_glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); + sf_glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); + sf_glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); + sf_glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); + sf_glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); + sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); + sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); + sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); + sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); + sf_glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); + sf_glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); + sf_glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); + sf_glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); + sf_glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); + sf_glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); + sf_glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); + sf_glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); + sf_glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); + sf_glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); + sf_glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); + sf_glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); + sf_glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); + sf_glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); + sf_glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); + sf_glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); + sf_glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); + sf_glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); + sf_glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); + sf_glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); + sf_glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); + sf_glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); + sf_glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); + sf_glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); + sf_glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); + sf_glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); + sf_glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); + sf_glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); + sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); + sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); + sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); + sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); + sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); + sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); + sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); + sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); + sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); + sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); + sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); + sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); + sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); + sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); + sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); + sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); + sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); + sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); + sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); + sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); + sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); + sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); + sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); + sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); + sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); + sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); + sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); + sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); + sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); + sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); + sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); + sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); + sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); + sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); + sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); + sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); + sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); +} +static void sf_glad_gl_load_GL_VERSION_2_1( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_2_1) return; + sf_glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); + sf_glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); + sf_glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); + sf_glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); + sf_glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); + sf_glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); +} +static void sf_glad_gl_load_GL_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_3_0) return; + sf_glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC) load(userptr, "glBeginConditionalRender"); + sf_glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); + sf_glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + sf_glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + sf_glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC) load(userptr, "glBindFragDataLocation"); + sf_glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); + sf_glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); + sf_glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + sf_glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); + sf_glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); + sf_glad_glClampColor = (PFNGLCLAMPCOLORPROC) load(userptr, "glClampColor"); + sf_glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); + sf_glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); + sf_glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); + sf_glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); + sf_glad_glColorMaski = (PFNGLCOLORMASKIPROC) load(userptr, "glColorMaski"); + sf_glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); + sf_glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); + sf_glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + sf_glad_glDisablei = (PFNGLDISABLEIPROC) load(userptr, "glDisablei"); + sf_glad_glEnablei = (PFNGLENABLEIPROC) load(userptr, "glEnablei"); + sf_glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC) load(userptr, "glEndConditionalRender"); + sf_glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); + sf_glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); + sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); + sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); + sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); + sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); + sf_glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); + sf_glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); + sf_glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); + sf_glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC) load(userptr, "glGetBooleani_v"); + sf_glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); + sf_glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); + sf_glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + sf_glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); + sf_glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); + sf_glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC) load(userptr, "glGetTexParameterIiv"); + sf_glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC) load(userptr, "glGetTexParameterIuiv"); + sf_glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); + sf_glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); + sf_glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); + sf_glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); + sf_glad_glIsEnabledi = (PFNGLISENABLEDIPROC) load(userptr, "glIsEnabledi"); + sf_glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); + sf_glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); + sf_glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); + sf_glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); + sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); + sf_glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); + sf_glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC) load(userptr, "glTexParameterIiv"); + sf_glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC) load(userptr, "glTexParameterIuiv"); + sf_glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); + sf_glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); + sf_glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); + sf_glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); + sf_glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); + sf_glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); + sf_glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); + sf_glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); + sf_glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); + sf_glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC) load(userptr, "glVertexAttribI1i"); + sf_glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC) load(userptr, "glVertexAttribI1iv"); + sf_glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC) load(userptr, "glVertexAttribI1ui"); + sf_glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC) load(userptr, "glVertexAttribI1uiv"); + sf_glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC) load(userptr, "glVertexAttribI2i"); + sf_glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC) load(userptr, "glVertexAttribI2iv"); + sf_glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC) load(userptr, "glVertexAttribI2ui"); + sf_glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC) load(userptr, "glVertexAttribI2uiv"); + sf_glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC) load(userptr, "glVertexAttribI3i"); + sf_glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC) load(userptr, "glVertexAttribI3iv"); + sf_glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC) load(userptr, "glVertexAttribI3ui"); + sf_glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC) load(userptr, "glVertexAttribI3uiv"); + sf_glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC) load(userptr, "glVertexAttribI4bv"); + sf_glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); + sf_glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); + sf_glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC) load(userptr, "glVertexAttribI4sv"); + sf_glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC) load(userptr, "glVertexAttribI4ubv"); + sf_glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); + sf_glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); + sf_glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC) load(userptr, "glVertexAttribI4usv"); + sf_glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); +} +static void sf_glad_gl_load_GL_VERSION_3_1( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_3_1) return; + sf_glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + sf_glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + sf_glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); + sf_glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); + sf_glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); + sf_glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + sf_glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + sf_glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + sf_glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + sf_glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + sf_glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + sf_glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + sf_glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC) load(userptr, "glPrimitiveRestartIndex"); + sf_glad_glTexBuffer = (PFNGLTEXBUFFERPROC) load(userptr, "glTexBuffer"); + sf_glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void sf_glad_gl_load_GL_VERSION_3_2( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_3_2) return; + sf_glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + sf_glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + sf_glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + sf_glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + sf_glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + sf_glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); + sf_glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); + sf_glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); + sf_glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + sf_glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + sf_glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + sf_glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + sf_glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); + sf_glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); + sf_glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + sf_glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + sf_glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); + sf_glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void sf_glad_gl_load_GL_VERSION_3_3( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_3_3) return; + sf_glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + sf_glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + sf_glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui"); + sf_glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv"); + sf_glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui"); + sf_glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv"); + sf_glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + sf_glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + sf_glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); + sf_glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + sf_glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + sf_glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + sf_glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + sf_glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + sf_glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + sf_glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + sf_glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui"); + sf_glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv"); + sf_glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui"); + sf_glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv"); + sf_glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui"); + sf_glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv"); + sf_glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui"); + sf_glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv"); + sf_glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui"); + sf_glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv"); + sf_glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); + sf_glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + sf_glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + sf_glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + sf_glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + sf_glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + sf_glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); + sf_glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui"); + sf_glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv"); + sf_glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui"); + sf_glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv"); + sf_glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui"); + sf_glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv"); + sf_glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui"); + sf_glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv"); + sf_glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui"); + sf_glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv"); + sf_glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); + sf_glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + sf_glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + sf_glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + sf_glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + sf_glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + sf_glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + sf_glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + sf_glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); + sf_glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui"); + sf_glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv"); + sf_glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui"); + sf_glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv"); + sf_glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui"); + sf_glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv"); +} +static void sf_glad_gl_load_GL_VERSION_4_0( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_0) return; + sf_glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed"); + sf_glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + sf_glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(userptr, "glBlendEquationSeparatei"); + sf_glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(userptr, "glBlendEquationi"); + sf_glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(userptr, "glBlendFuncSeparatei"); + sf_glad_glBlendFunci = (PFNGLBLENDFUNCIPROC) load(userptr, "glBlendFunci"); + sf_glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + sf_glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + sf_glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); + sf_glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback"); + sf_glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream"); + sf_glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed"); + sf_glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + sf_glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName"); + sf_glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName"); + sf_glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv"); + sf_glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv"); + sf_glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv"); + sf_glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex"); + sf_glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation"); + sf_glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv"); + sf_glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv"); + sf_glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + sf_glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(userptr, "glMinSampleShading"); + sf_glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv"); + sf_glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); + sf_glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + sf_glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); + sf_glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d"); + sf_glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv"); + sf_glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d"); + sf_glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv"); + sf_glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d"); + sf_glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv"); + sf_glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d"); + sf_glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv"); + sf_glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv"); + sf_glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv"); + sf_glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv"); + sf_glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv"); + sf_glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv"); + sf_glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv"); + sf_glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv"); + sf_glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv"); + sf_glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv"); + sf_glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv"); +} +static void sf_glad_gl_load_GL_VERSION_4_1( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_1) return; + sf_glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); + sf_glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline"); + sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + sf_glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv"); + sf_glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines"); + sf_glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv"); + sf_glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed"); + sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + sf_glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines"); + sf_glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v"); + sf_glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v"); + sf_glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); + sf_glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog"); + sf_glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv"); + sf_glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + sf_glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv"); + sf_glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline"); + sf_glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); + sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + sf_glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d"); + sf_glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv"); + sf_glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f"); + sf_glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv"); + sf_glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i"); + sf_glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv"); + sf_glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui"); + sf_glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv"); + sf_glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d"); + sf_glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv"); + sf_glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f"); + sf_glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv"); + sf_glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i"); + sf_glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv"); + sf_glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui"); + sf_glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv"); + sf_glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d"); + sf_glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv"); + sf_glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f"); + sf_glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv"); + sf_glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i"); + sf_glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv"); + sf_glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui"); + sf_glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv"); + sf_glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d"); + sf_glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv"); + sf_glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f"); + sf_glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv"); + sf_glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i"); + sf_glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv"); + sf_glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui"); + sf_glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv"); + sf_glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv"); + sf_glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv"); + sf_glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv"); + sf_glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv"); + sf_glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv"); + sf_glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv"); + sf_glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv"); + sf_glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv"); + sf_glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv"); + sf_glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv"); + sf_glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv"); + sf_glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv"); + sf_glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv"); + sf_glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv"); + sf_glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv"); + sf_glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv"); + sf_glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv"); + sf_glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv"); + sf_glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + sf_glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv"); + sf_glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed"); + sf_glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv"); + sf_glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); + sf_glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); + sf_glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); + sf_glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d"); + sf_glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv"); + sf_glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d"); + sf_glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv"); + sf_glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d"); + sf_glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv"); + sf_glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d"); + sf_glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv"); + sf_glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer"); + sf_glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv"); + sf_glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf"); + sf_glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv"); +} +static void sf_glad_gl_load_GL_VERSION_4_2( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_2) return; + sf_glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + sf_glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance"); + sf_glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance"); + sf_glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance"); + sf_glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced"); + sf_glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced"); + sf_glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv"); + sf_glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); + sf_glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); + sf_glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D"); + sf_glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + sf_glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); +} +static void sf_glad_gl_load_GL_VERSION_4_3( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_3) return; + sf_glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + sf_glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData"); + sf_glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData"); + sf_glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); + sf_glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + sf_glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + sf_glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + sf_glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + sf_glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); + sf_glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + sf_glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + sf_glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); + sf_glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v"); + sf_glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + sf_glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + sf_glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + sf_glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + sf_glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + sf_glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex"); + sf_glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + sf_glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); + sf_glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData"); + sf_glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData"); + sf_glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + sf_glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + sf_glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage"); + sf_glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage"); + sf_glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect"); + sf_glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect"); + sf_glad_glObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + sf_glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + sf_glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + sf_glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); + sf_glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding"); + sf_glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); + sf_glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + sf_glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); + sf_glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView"); + sf_glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + sf_glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + sf_glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + sf_glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat"); + sf_glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} +static void sf_glad_gl_load_GL_VERSION_4_4( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_4) return; + sf_glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase"); + sf_glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange"); + sf_glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures"); + sf_glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers"); + sf_glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures"); + sf_glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers"); + sf_glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage"); + sf_glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage"); + sf_glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage"); +} +static void sf_glad_gl_load_GL_VERSION_4_5( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_5) return; + sf_glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit"); + sf_glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer"); + sf_glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus"); + sf_glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData"); + sf_glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData"); + sf_glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi"); + sf_glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv"); + sf_glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv"); + sf_glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv"); + sf_glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl"); + sf_glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D"); + sf_glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D"); + sf_glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D"); + sf_glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData"); + sf_glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D"); + sf_glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D"); + sf_glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D"); + sf_glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers"); + sf_glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers"); + sf_glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines"); + sf_glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries"); + sf_glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers"); + sf_glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers"); + sf_glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures"); + sf_glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks"); + sf_glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays"); + sf_glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib"); + sf_glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib"); + sf_glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange"); + sf_glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap"); + sf_glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage"); + sf_glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage"); + sf_glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus"); + sf_glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v"); + sf_glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv"); + sf_glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv"); + sf_glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData"); + sf_glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv"); + sf_glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv"); + sf_glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv"); + sf_glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v"); + sf_glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv"); + sf_glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v"); + sf_glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv"); + sf_glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage"); + sf_glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv"); + sf_glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv"); + sf_glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv"); + sf_glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv"); + sf_glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv"); + sf_glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv"); + sf_glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage"); + sf_glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v"); + sf_glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v"); + sf_glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv"); + sf_glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv"); + sf_glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv"); + sf_glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv"); + sf_glad_glGetnColorTable = (PFNGLGETNCOLORTABLEPROC) load(userptr, "glGetnColorTable"); + sf_glad_glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC) load(userptr, "glGetnCompressedTexImage"); + sf_glad_glGetnConvolutionFilter = (PFNGLGETNCONVOLUTIONFILTERPROC) load(userptr, "glGetnConvolutionFilter"); + sf_glad_glGetnHistogram = (PFNGLGETNHISTOGRAMPROC) load(userptr, "glGetnHistogram"); + sf_glad_glGetnMapdv = (PFNGLGETNMAPDVPROC) load(userptr, "glGetnMapdv"); + sf_glad_glGetnMapfv = (PFNGLGETNMAPFVPROC) load(userptr, "glGetnMapfv"); + sf_glad_glGetnMapiv = (PFNGLGETNMAPIVPROC) load(userptr, "glGetnMapiv"); + sf_glad_glGetnMinmax = (PFNGLGETNMINMAXPROC) load(userptr, "glGetnMinmax"); + sf_glad_glGetnPixelMapfv = (PFNGLGETNPIXELMAPFVPROC) load(userptr, "glGetnPixelMapfv"); + sf_glad_glGetnPixelMapuiv = (PFNGLGETNPIXELMAPUIVPROC) load(userptr, "glGetnPixelMapuiv"); + sf_glad_glGetnPixelMapusv = (PFNGLGETNPIXELMAPUSVPROC) load(userptr, "glGetnPixelMapusv"); + sf_glad_glGetnPolygonStipple = (PFNGLGETNPOLYGONSTIPPLEPROC) load(userptr, "glGetnPolygonStipple"); + sf_glad_glGetnSeparableFilter = (PFNGLGETNSEPARABLEFILTERPROC) load(userptr, "glGetnSeparableFilter"); + sf_glad_glGetnTexImage = (PFNGLGETNTEXIMAGEPROC) load(userptr, "glGetnTexImage"); + sf_glad_glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC) load(userptr, "glGetnUniformdv"); + sf_glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv"); + sf_glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv"); + sf_glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv"); + sf_glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData"); + sf_glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData"); + sf_glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer"); + sf_glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange"); + sf_glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion"); + sf_glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData"); + sf_glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage"); + sf_glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData"); + sf_glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer"); + sf_glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers"); + sf_glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri"); + sf_glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer"); + sf_glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer"); + sf_glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture"); + sf_glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer"); + sf_glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage"); + sf_glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample"); + sf_glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels"); + sf_glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier"); + sf_glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer"); + sf_glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange"); + sf_glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv"); + sf_glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv"); + sf_glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf"); + sf_glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv"); + sf_glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri"); + sf_glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv"); + sf_glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D"); + sf_glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D"); + sf_glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample"); + sf_glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D"); + sf_glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample"); + sf_glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D"); + sf_glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D"); + sf_glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D"); + sf_glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase"); + sf_glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange"); + sf_glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer"); + sf_glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding"); + sf_glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat"); + sf_glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat"); + sf_glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat"); + sf_glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor"); + sf_glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer"); + sf_glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer"); + sf_glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers"); +} +static void sf_glad_gl_load_GL_VERSION_4_6( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_4_6) return; + sf_glad_glMultiDrawArraysIndirectCount = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawArraysIndirectCount"); + sf_glad_glMultiDrawElementsIndirectCount = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) load(userptr, "glMultiDrawElementsIndirectCount"); + sf_glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp"); + sf_glad_glSpecializeShader = (PFNGLSPECIALIZESHADERPROC) load(userptr, "glSpecializeShader"); +} +static void sf_glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_VERSION_ES_CM_1_0) return; + sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); + sf_glad_glAlphaFunc = (PFNGLALPHAFUNCPROC) load(userptr, "glAlphaFunc"); + sf_glad_glAlphaFuncx = (PFNGLALPHAFUNCXPROC) load(userptr, "glAlphaFuncx"); + sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); + sf_glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); + sf_glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); + sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); + sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); + sf_glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); + sf_glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); + sf_glad_glClearColorx = (PFNGLCLEARCOLORXPROC) load(userptr, "glClearColorx"); + sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + sf_glad_glClearDepthx = (PFNGLCLEARDEPTHXPROC) load(userptr, "glClearDepthx"); + sf_glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); + sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture"); + sf_glad_glClipPlanef = (PFNGLCLIPPLANEFPROC) load(userptr, "glClipPlanef"); + sf_glad_glClipPlanex = (PFNGLCLIPPLANEXPROC) load(userptr, "glClipPlanex"); + sf_glad_glColor4f = (PFNGLCOLOR4FPROC) load(userptr, "glColor4f"); + sf_glad_glColor4ub = (PFNGLCOLOR4UBPROC) load(userptr, "glColor4ub"); + sf_glad_glColor4x = (PFNGLCOLOR4XPROC) load(userptr, "glColor4x"); + sf_glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); + sf_glad_glColorPointer = (PFNGLCOLORPOINTERPROC) load(userptr, "glColorPointer"); + sf_glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); + sf_glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); + sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); + sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); + sf_glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); + sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); + sf_glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); + sf_glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); + sf_glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); + sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + sf_glad_glDepthRangex = (PFNGLDEPTHRANGEXPROC) load(userptr, "glDepthRangex"); + sf_glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); + sf_glad_glDisableClientState = (PFNGLDISABLECLIENTSTATEPROC) load(userptr, "glDisableClientState"); + sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); + sf_glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); + sf_glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); + sf_glad_glEnableClientState = (PFNGLENABLECLIENTSTATEPROC) load(userptr, "glEnableClientState"); + sf_glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); + sf_glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); + sf_glad_glFogf = (PFNGLFOGFPROC) load(userptr, "glFogf"); + sf_glad_glFogfv = (PFNGLFOGFVPROC) load(userptr, "glFogfv"); + sf_glad_glFogx = (PFNGLFOGXPROC) load(userptr, "glFogx"); + sf_glad_glFogxv = (PFNGLFOGXVPROC) load(userptr, "glFogxv"); + sf_glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); + sf_glad_glFrustumf = (PFNGLFRUSTUMFPROC) load(userptr, "glFrustumf"); + sf_glad_glFrustumx = (PFNGLFRUSTUMXPROC) load(userptr, "glFrustumx"); + sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); + sf_glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + sf_glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); + sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); + sf_glad_glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC) load(userptr, "glGetClipPlanef"); + sf_glad_glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC) load(userptr, "glGetClipPlanex"); + sf_glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); + sf_glad_glGetFixedv = (PFNGLGETFIXEDVPROC) load(userptr, "glGetFixedv"); + sf_glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); + sf_glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); + sf_glad_glGetLightfv = (PFNGLGETLIGHTFVPROC) load(userptr, "glGetLightfv"); + sf_glad_glGetLightxv = (PFNGLGETLIGHTXVPROC) load(userptr, "glGetLightxv"); + sf_glad_glGetMaterialfv = (PFNGLGETMATERIALFVPROC) load(userptr, "glGetMaterialfv"); + sf_glad_glGetMaterialxv = (PFNGLGETMATERIALXVPROC) load(userptr, "glGetMaterialxv"); + sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + sf_glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); + sf_glad_glGetTexEnvfv = (PFNGLGETTEXENVFVPROC) load(userptr, "glGetTexEnvfv"); + sf_glad_glGetTexEnviv = (PFNGLGETTEXENVIVPROC) load(userptr, "glGetTexEnviv"); + sf_glad_glGetTexEnvxv = (PFNGLGETTEXENVXVPROC) load(userptr, "glGetTexEnvxv"); + sf_glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); + sf_glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); + sf_glad_glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC) load(userptr, "glGetTexParameterxv"); + sf_glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); + sf_glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); + sf_glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); + sf_glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); + sf_glad_glLightModelf = (PFNGLLIGHTMODELFPROC) load(userptr, "glLightModelf"); + sf_glad_glLightModelfv = (PFNGLLIGHTMODELFVPROC) load(userptr, "glLightModelfv"); + sf_glad_glLightModelx = (PFNGLLIGHTMODELXPROC) load(userptr, "glLightModelx"); + sf_glad_glLightModelxv = (PFNGLLIGHTMODELXVPROC) load(userptr, "glLightModelxv"); + sf_glad_glLightf = (PFNGLLIGHTFPROC) load(userptr, "glLightf"); + sf_glad_glLightfv = (PFNGLLIGHTFVPROC) load(userptr, "glLightfv"); + sf_glad_glLightx = (PFNGLLIGHTXPROC) load(userptr, "glLightx"); + sf_glad_glLightxv = (PFNGLLIGHTXVPROC) load(userptr, "glLightxv"); + sf_glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); + sf_glad_glLineWidthx = (PFNGLLINEWIDTHXPROC) load(userptr, "glLineWidthx"); + sf_glad_glLoadIdentity = (PFNGLLOADIDENTITYPROC) load(userptr, "glLoadIdentity"); + sf_glad_glLoadMatrixf = (PFNGLLOADMATRIXFPROC) load(userptr, "glLoadMatrixf"); + sf_glad_glLoadMatrixx = (PFNGLLOADMATRIXXPROC) load(userptr, "glLoadMatrixx"); + sf_glad_glLogicOp = (PFNGLLOGICOPPROC) load(userptr, "glLogicOp"); + sf_glad_glMaterialf = (PFNGLMATERIALFPROC) load(userptr, "glMaterialf"); + sf_glad_glMaterialfv = (PFNGLMATERIALFVPROC) load(userptr, "glMaterialfv"); + sf_glad_glMaterialx = (PFNGLMATERIALXPROC) load(userptr, "glMaterialx"); + sf_glad_glMaterialxv = (PFNGLMATERIALXVPROC) load(userptr, "glMaterialxv"); + sf_glad_glMatrixMode = (PFNGLMATRIXMODEPROC) load(userptr, "glMatrixMode"); + sf_glad_glMultMatrixf = (PFNGLMULTMATRIXFPROC) load(userptr, "glMultMatrixf"); + sf_glad_glMultMatrixx = (PFNGLMULTMATRIXXPROC) load(userptr, "glMultMatrixx"); + sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); + sf_glad_glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC) load(userptr, "glMultiTexCoord4x"); + sf_glad_glNormal3f = (PFNGLNORMAL3FPROC) load(userptr, "glNormal3f"); + sf_glad_glNormal3x = (PFNGLNORMAL3XPROC) load(userptr, "glNormal3x"); sf_glad_glNormalPointer = (PFNGLNORMALPOINTERPROC) load(userptr, "glNormalPointer"); sf_glad_glOrthof = (PFNGLORTHOFPROC) load(userptr, "glOrthof"); sf_glad_glOrthox = (PFNGLORTHOXPROC) load(userptr, "glOrthox"); @@ -6248,10 +10275,199 @@ static void sf_glad_gl_load_GL_VERSION_ES_CM_1_0( GLADuserptrloadfunc load, void sf_glad_glVertexPointer = (PFNGLVERTEXPOINTERPROC) load(userptr, "glVertexPointer"); sf_glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); } +static void sf_glad_gl_load_GL_ARB_ES2_compatibility( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_ES2_compatibility) return; + sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + sf_glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + sf_glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + sf_glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); +} +static void sf_glad_gl_load_GL_ARB_ES3_1_compatibility( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_ES3_1_compatibility) return; + sf_glad_glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC) load(userptr, "glMemoryBarrierByRegion"); +} +static void sf_glad_gl_load_GL_ARB_base_instance( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_base_instance) return; + sf_glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance"); + sf_glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance"); + sf_glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance"); +} +static void sf_glad_gl_load_GL_ARB_blend_func_extended( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_blend_func_extended) return; + sf_glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) load(userptr, "glBindFragDataLocationIndexed"); + sf_glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC) load(userptr, "glGetFragDataIndex"); +} +static void sf_glad_gl_load_GL_ARB_buffer_storage( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_buffer_storage) return; + sf_glad_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) load(userptr, "glBufferStorage"); +} +static void sf_glad_gl_load_GL_ARB_clear_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_clear_buffer_object) return; + sf_glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData"); + sf_glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData"); +} +static void sf_glad_gl_load_GL_ARB_clear_texture( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_clear_texture) return; + sf_glad_glClearTexImage = (PFNGLCLEARTEXIMAGEPROC) load(userptr, "glClearTexImage"); + sf_glad_glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC) load(userptr, "glClearTexSubImage"); +} +static void sf_glad_gl_load_GL_ARB_clip_control( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_clip_control) return; + sf_glad_glClipControl = (PFNGLCLIPCONTROLPROC) load(userptr, "glClipControl"); +} +static void sf_glad_gl_load_GL_ARB_compute_shader( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_compute_shader) return; + sf_glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + sf_glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); +} static void sf_glad_gl_load_GL_ARB_copy_buffer( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_copy_buffer) return; sf_glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); } +static void sf_glad_gl_load_GL_ARB_copy_image( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_copy_image) return; + sf_glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); +} +static void sf_glad_gl_load_GL_ARB_direct_state_access( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_direct_state_access) return; + sf_glad_glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC) load(userptr, "glBindTextureUnit"); + sf_glad_glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC) load(userptr, "glBlitNamedFramebuffer"); + sf_glad_glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckNamedFramebufferStatus"); + sf_glad_glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC) load(userptr, "glClearNamedBufferData"); + sf_glad_glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC) load(userptr, "glClearNamedBufferSubData"); + sf_glad_glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) load(userptr, "glClearNamedFramebufferfi"); + sf_glad_glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) load(userptr, "glClearNamedFramebufferfv"); + sf_glad_glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) load(userptr, "glClearNamedFramebufferiv"); + sf_glad_glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) load(userptr, "glClearNamedFramebufferuiv"); + sf_glad_glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) load(userptr, "glCompressedTextureSubImage1D"); + sf_glad_glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) load(userptr, "glCompressedTextureSubImage2D"); + sf_glad_glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) load(userptr, "glCompressedTextureSubImage3D"); + sf_glad_glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC) load(userptr, "glCopyNamedBufferSubData"); + sf_glad_glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC) load(userptr, "glCopyTextureSubImage1D"); + sf_glad_glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC) load(userptr, "glCopyTextureSubImage2D"); + sf_glad_glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC) load(userptr, "glCopyTextureSubImage3D"); + sf_glad_glCreateBuffers = (PFNGLCREATEBUFFERSPROC) load(userptr, "glCreateBuffers"); + sf_glad_glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC) load(userptr, "glCreateFramebuffers"); + sf_glad_glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC) load(userptr, "glCreateProgramPipelines"); + sf_glad_glCreateQueries = (PFNGLCREATEQUERIESPROC) load(userptr, "glCreateQueries"); + sf_glad_glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC) load(userptr, "glCreateRenderbuffers"); + sf_glad_glCreateSamplers = (PFNGLCREATESAMPLERSPROC) load(userptr, "glCreateSamplers"); + sf_glad_glCreateTextures = (PFNGLCREATETEXTURESPROC) load(userptr, "glCreateTextures"); + sf_glad_glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC) load(userptr, "glCreateTransformFeedbacks"); + sf_glad_glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC) load(userptr, "glCreateVertexArrays"); + sf_glad_glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC) load(userptr, "glDisableVertexArrayAttrib"); + sf_glad_glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC) load(userptr, "glEnableVertexArrayAttrib"); + sf_glad_glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) load(userptr, "glFlushMappedNamedBufferRange"); + sf_glad_glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC) load(userptr, "glGenerateTextureMipmap"); + sf_glad_glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) load(userptr, "glGetCompressedTextureImage"); + sf_glad_glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) load(userptr, "glGetNamedBufferParameteri64v"); + sf_glad_glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedBufferParameteriv"); + sf_glad_glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC) load(userptr, "glGetNamedBufferPointerv"); + sf_glad_glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC) load(userptr, "glGetNamedBufferSubData"); + sf_glad_glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferAttachmentParameteriv"); + sf_glad_glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedFramebufferParameteriv"); + sf_glad_glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetNamedRenderbufferParameteriv"); + sf_glad_glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC) load(userptr, "glGetQueryBufferObjecti64v"); + sf_glad_glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC) load(userptr, "glGetQueryBufferObjectiv"); + sf_glad_glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC) load(userptr, "glGetQueryBufferObjectui64v"); + sf_glad_glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC) load(userptr, "glGetQueryBufferObjectuiv"); + sf_glad_glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC) load(userptr, "glGetTextureImage"); + sf_glad_glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC) load(userptr, "glGetTextureLevelParameterfv"); + sf_glad_glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC) load(userptr, "glGetTextureLevelParameteriv"); + sf_glad_glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC) load(userptr, "glGetTextureParameterIiv"); + sf_glad_glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC) load(userptr, "glGetTextureParameterIuiv"); + sf_glad_glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC) load(userptr, "glGetTextureParameterfv"); + sf_glad_glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC) load(userptr, "glGetTextureParameteriv"); + sf_glad_glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC) load(userptr, "glGetTransformFeedbacki64_v"); + sf_glad_glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC) load(userptr, "glGetTransformFeedbacki_v"); + sf_glad_glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC) load(userptr, "glGetTransformFeedbackiv"); + sf_glad_glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC) load(userptr, "glGetVertexArrayIndexed64iv"); + sf_glad_glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC) load(userptr, "glGetVertexArrayIndexediv"); + sf_glad_glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC) load(userptr, "glGetVertexArrayiv"); + sf_glad_glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) load(userptr, "glInvalidateNamedFramebufferData"); + sf_glad_glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) load(userptr, "glInvalidateNamedFramebufferSubData"); + sf_glad_glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC) load(userptr, "glMapNamedBuffer"); + sf_glad_glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC) load(userptr, "glMapNamedBufferRange"); + sf_glad_glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC) load(userptr, "glNamedBufferData"); + sf_glad_glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC) load(userptr, "glNamedBufferStorage"); + sf_glad_glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC) load(userptr, "glNamedBufferSubData"); + sf_glad_glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) load(userptr, "glNamedFramebufferDrawBuffer"); + sf_glad_glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) load(userptr, "glNamedFramebufferDrawBuffers"); + sf_glad_glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) load(userptr, "glNamedFramebufferParameteri"); + sf_glad_glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) load(userptr, "glNamedFramebufferReadBuffer"); + sf_glad_glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glNamedFramebufferRenderbuffer"); + sf_glad_glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) load(userptr, "glNamedFramebufferTexture"); + sf_glad_glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glNamedFramebufferTextureLayer"); + sf_glad_glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC) load(userptr, "glNamedRenderbufferStorage"); + sf_glad_glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glNamedRenderbufferStorageMultisample"); + sf_glad_glTextureBuffer = (PFNGLTEXTUREBUFFERPROC) load(userptr, "glTextureBuffer"); + sf_glad_glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC) load(userptr, "glTextureBufferRange"); + sf_glad_glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC) load(userptr, "glTextureParameterIiv"); + sf_glad_glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC) load(userptr, "glTextureParameterIuiv"); + sf_glad_glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC) load(userptr, "glTextureParameterf"); + sf_glad_glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC) load(userptr, "glTextureParameterfv"); + sf_glad_glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC) load(userptr, "glTextureParameteri"); + sf_glad_glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC) load(userptr, "glTextureParameteriv"); + sf_glad_glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC) load(userptr, "glTextureStorage1D"); + sf_glad_glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC) load(userptr, "glTextureStorage2D"); + sf_glad_glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) load(userptr, "glTextureStorage2DMultisample"); + sf_glad_glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC) load(userptr, "glTextureStorage3D"); + sf_glad_glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) load(userptr, "glTextureStorage3DMultisample"); + sf_glad_glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC) load(userptr, "glTextureSubImage1D"); + sf_glad_glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC) load(userptr, "glTextureSubImage2D"); + sf_glad_glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC) load(userptr, "glTextureSubImage3D"); + sf_glad_glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) load(userptr, "glTransformFeedbackBufferBase"); + sf_glad_glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) load(userptr, "glTransformFeedbackBufferRange"); + sf_glad_glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC) load(userptr, "glUnmapNamedBuffer"); + sf_glad_glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC) load(userptr, "glVertexArrayAttribBinding"); + sf_glad_glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC) load(userptr, "glVertexArrayAttribFormat"); + sf_glad_glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC) load(userptr, "glVertexArrayAttribIFormat"); + sf_glad_glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC) load(userptr, "glVertexArrayAttribLFormat"); + sf_glad_glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC) load(userptr, "glVertexArrayBindingDivisor"); + sf_glad_glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC) load(userptr, "glVertexArrayElementBuffer"); + sf_glad_glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC) load(userptr, "glVertexArrayVertexBuffer"); + sf_glad_glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC) load(userptr, "glVertexArrayVertexBuffers"); +} +static void sf_glad_gl_load_GL_ARB_draw_elements_base_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_draw_elements_base_vertex) return; + sf_glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glDrawElementsBaseVertex"); + sf_glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) load(userptr, "glDrawElementsInstancedBaseVertex"); + sf_glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) load(userptr, "glDrawRangeElementsBaseVertex"); + sf_glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) load(userptr, "glMultiDrawElementsBaseVertex"); +} +static void sf_glad_gl_load_GL_ARB_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_draw_indirect) return; + sf_glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + sf_glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); +} +static void sf_glad_gl_load_GL_ARB_fragment_program( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_fragment_program) return; + sf_glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); + sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); + sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); + sf_glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB"); + sf_glad_glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC) load(userptr, "glGetProgramEnvParameterfvARB"); + sf_glad_glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) load(userptr, "glGetProgramLocalParameterdvARB"); + sf_glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB"); + sf_glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB"); + sf_glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB"); + sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); + sf_glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB"); + sf_glad_glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC) load(userptr, "glProgramEnvParameter4dvARB"); + sf_glad_glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC) load(userptr, "glProgramEnvParameter4fARB"); + sf_glad_glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC) load(userptr, "glProgramEnvParameter4fvARB"); + sf_glad_glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) load(userptr, "glProgramLocalParameter4dARB"); + sf_glad_glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) load(userptr, "glProgramLocalParameter4dvARB"); + sf_glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB"); + sf_glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB"); + sf_glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB"); +} +static void sf_glad_gl_load_GL_ARB_framebuffer_no_attachments( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_framebuffer_no_attachments) return; + sf_glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + sf_glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); +} static void sf_glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_framebuffer_object) return; sf_glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); @@ -6277,12 +10493,9 @@ static void sf_glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, } static void sf_glad_gl_load_GL_ARB_geometry_shader4( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_geometry_shader4) return; - sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC) load(userptr, "glFramebufferTextureARB"); sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB"); - sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) load(userptr, "glFramebufferTextureLayerARB"); - sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); sf_glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC) load(userptr, "glProgramParameteriARB"); } static void sf_glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) { @@ -6291,6 +10504,32 @@ static void sf_glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, sf_glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); } +static void sf_glad_gl_load_GL_ARB_get_texture_sub_image( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_get_texture_sub_image) return; + sf_glad_glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) load(userptr, "glGetCompressedTextureSubImage"); + sf_glad_glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC) load(userptr, "glGetTextureSubImage"); +} +static void sf_glad_gl_load_GL_ARB_gpu_shader_fp64( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_gpu_shader_fp64) return; + sf_glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv"); + sf_glad_glUniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d"); + sf_glad_glUniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv"); + sf_glad_glUniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d"); + sf_glad_glUniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv"); + sf_glad_glUniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d"); + sf_glad_glUniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv"); + sf_glad_glUniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d"); + sf_glad_glUniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv"); + sf_glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv"); + sf_glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv"); + sf_glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv"); + sf_glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv"); + sf_glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv"); + sf_glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv"); + sf_glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv"); + sf_glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv"); + sf_glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv"); +} static void sf_glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_imaging) return; sf_glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); @@ -6328,77 +10567,113 @@ static void sf_glad_gl_load_GL_ARB_imaging( GLADuserptrloadfunc load, void* user sf_glad_glResetMinmax = (PFNGLRESETMINMAXPROC) load(userptr, "glResetMinmax"); sf_glad_glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC) load(userptr, "glSeparableFilter2D"); } +static void sf_glad_gl_load_GL_ARB_internalformat_query( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_internalformat_query) return; + sf_glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); +} +static void sf_glad_gl_load_GL_ARB_internalformat_query2( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_internalformat_query2) return; + sf_glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v"); +} +static void sf_glad_gl_load_GL_ARB_invalidate_subdata( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_invalidate_subdata) return; + sf_glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData"); + sf_glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData"); + sf_glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + sf_glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + sf_glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage"); + sf_glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage"); +} +static void sf_glad_gl_load_GL_ARB_map_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_map_buffer_range) return; + sf_glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); + sf_glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); +} +static void sf_glad_gl_load_GL_ARB_multi_bind( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_multi_bind) return; + sf_glad_glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC) load(userptr, "glBindBuffersBase"); + sf_glad_glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC) load(userptr, "glBindBuffersRange"); + sf_glad_glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC) load(userptr, "glBindImageTextures"); + sf_glad_glBindSamplers = (PFNGLBINDSAMPLERSPROC) load(userptr, "glBindSamplers"); + sf_glad_glBindTextures = (PFNGLBINDTEXTURESPROC) load(userptr, "glBindTextures"); + sf_glad_glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC) load(userptr, "glBindVertexBuffers"); +} +static void sf_glad_gl_load_GL_ARB_multi_draw_indirect( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_multi_draw_indirect) return; + sf_glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect"); + sf_glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect"); +} static void sf_glad_gl_load_GL_ARB_multitexture( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_multitexture) return; - sf_glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); sf_glad_glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) load(userptr, "glActiveTextureARB"); - sf_glad_glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC) load(userptr, "glClientActiveTexture"); sf_glad_glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) load(userptr, "glClientActiveTextureARB"); - sf_glad_glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC) load(userptr, "glMultiTexCoord1d"); sf_glad_glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC) load(userptr, "glMultiTexCoord1dARB"); - sf_glad_glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC) load(userptr, "glMultiTexCoord1dv"); sf_glad_glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC) load(userptr, "glMultiTexCoord1dvARB"); - sf_glad_glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC) load(userptr, "glMultiTexCoord1f"); sf_glad_glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC) load(userptr, "glMultiTexCoord1fARB"); - sf_glad_glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC) load(userptr, "glMultiTexCoord1fv"); sf_glad_glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC) load(userptr, "glMultiTexCoord1fvARB"); - sf_glad_glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC) load(userptr, "glMultiTexCoord1i"); sf_glad_glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC) load(userptr, "glMultiTexCoord1iARB"); - sf_glad_glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC) load(userptr, "glMultiTexCoord1iv"); sf_glad_glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC) load(userptr, "glMultiTexCoord1ivARB"); - sf_glad_glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC) load(userptr, "glMultiTexCoord1s"); sf_glad_glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC) load(userptr, "glMultiTexCoord1sARB"); - sf_glad_glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC) load(userptr, "glMultiTexCoord1sv"); sf_glad_glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC) load(userptr, "glMultiTexCoord1svARB"); - sf_glad_glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC) load(userptr, "glMultiTexCoord2d"); sf_glad_glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC) load(userptr, "glMultiTexCoord2dARB"); - sf_glad_glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC) load(userptr, "glMultiTexCoord2dv"); sf_glad_glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC) load(userptr, "glMultiTexCoord2dvARB"); - sf_glad_glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC) load(userptr, "glMultiTexCoord2f"); sf_glad_glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) load(userptr, "glMultiTexCoord2fARB"); - sf_glad_glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC) load(userptr, "glMultiTexCoord2fv"); sf_glad_glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) load(userptr, "glMultiTexCoord2fvARB"); - sf_glad_glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC) load(userptr, "glMultiTexCoord2i"); sf_glad_glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC) load(userptr, "glMultiTexCoord2iARB"); - sf_glad_glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC) load(userptr, "glMultiTexCoord2iv"); sf_glad_glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC) load(userptr, "glMultiTexCoord2ivARB"); - sf_glad_glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC) load(userptr, "glMultiTexCoord2s"); sf_glad_glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC) load(userptr, "glMultiTexCoord2sARB"); - sf_glad_glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC) load(userptr, "glMultiTexCoord2sv"); sf_glad_glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC) load(userptr, "glMultiTexCoord2svARB"); - sf_glad_glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC) load(userptr, "glMultiTexCoord3d"); sf_glad_glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC) load(userptr, "glMultiTexCoord3dARB"); - sf_glad_glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC) load(userptr, "glMultiTexCoord3dv"); sf_glad_glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC) load(userptr, "glMultiTexCoord3dvARB"); - sf_glad_glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC) load(userptr, "glMultiTexCoord3f"); sf_glad_glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC) load(userptr, "glMultiTexCoord3fARB"); - sf_glad_glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC) load(userptr, "glMultiTexCoord3fv"); sf_glad_glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC) load(userptr, "glMultiTexCoord3fvARB"); - sf_glad_glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC) load(userptr, "glMultiTexCoord3i"); sf_glad_glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC) load(userptr, "glMultiTexCoord3iARB"); - sf_glad_glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC) load(userptr, "glMultiTexCoord3iv"); sf_glad_glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC) load(userptr, "glMultiTexCoord3ivARB"); - sf_glad_glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC) load(userptr, "glMultiTexCoord3s"); sf_glad_glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC) load(userptr, "glMultiTexCoord3sARB"); - sf_glad_glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC) load(userptr, "glMultiTexCoord3sv"); sf_glad_glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC) load(userptr, "glMultiTexCoord3svARB"); - sf_glad_glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC) load(userptr, "glMultiTexCoord4d"); sf_glad_glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC) load(userptr, "glMultiTexCoord4dARB"); - sf_glad_glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC) load(userptr, "glMultiTexCoord4dv"); sf_glad_glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC) load(userptr, "glMultiTexCoord4dvARB"); - sf_glad_glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC) load(userptr, "glMultiTexCoord4f"); sf_glad_glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC) load(userptr, "glMultiTexCoord4fARB"); - sf_glad_glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC) load(userptr, "glMultiTexCoord4fv"); sf_glad_glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC) load(userptr, "glMultiTexCoord4fvARB"); - sf_glad_glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC) load(userptr, "glMultiTexCoord4i"); sf_glad_glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC) load(userptr, "glMultiTexCoord4iARB"); - sf_glad_glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC) load(userptr, "glMultiTexCoord4iv"); sf_glad_glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC) load(userptr, "glMultiTexCoord4ivARB"); - sf_glad_glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC) load(userptr, "glMultiTexCoord4s"); sf_glad_glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC) load(userptr, "glMultiTexCoord4sARB"); - sf_glad_glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC) load(userptr, "glMultiTexCoord4sv"); sf_glad_glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC) load(userptr, "glMultiTexCoord4svARB"); } +static void sf_glad_gl_load_GL_ARB_polygon_offset_clamp( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_polygon_offset_clamp) return; + sf_glad_glPolygonOffsetClamp = (PFNGLPOLYGONOFFSETCLAMPPROC) load(userptr, "glPolygonOffsetClamp"); +} +static void sf_glad_gl_load_GL_ARB_program_interface_query( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_program_interface_query) return; + sf_glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + sf_glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + sf_glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + sf_glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex"); + sf_glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + sf_glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); +} +static void sf_glad_gl_load_GL_ARB_provoking_vertex( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_provoking_vertex) return; + sf_glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC) load(userptr, "glProvokingVertex"); +} +static void sf_glad_gl_load_GL_ARB_sampler_objects( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_sampler_objects) return; + sf_glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); + sf_glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); + sf_glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); + sf_glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC) load(userptr, "glGetSamplerParameterIiv"); + sf_glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC) load(userptr, "glGetSamplerParameterIuiv"); + sf_glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); + sf_glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); + sf_glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); + sf_glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC) load(userptr, "glSamplerParameterIiv"); + sf_glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC) load(userptr, "glSamplerParameterIuiv"); + sf_glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); + sf_glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); + sf_glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); + sf_glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); +} static void sf_glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_separate_shader_objects) return; sf_glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); @@ -6463,113 +10738,206 @@ static void sf_glad_gl_load_GL_ARB_separate_shader_objects( GLADuserptrloadfunc sf_glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); sf_glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); } +static void sf_glad_gl_load_GL_ARB_shader_atomic_counters( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_shader_atomic_counters) return; + sf_glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv"); +} +static void sf_glad_gl_load_GL_ARB_shader_image_load_store( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_shader_image_load_store) return; + sf_glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + sf_glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); +} static void sf_glad_gl_load_GL_ARB_shader_objects( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_shader_objects) return; sf_glad_glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) load(userptr, "glAttachObjectARB"); - sf_glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); - sf_glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); sf_glad_glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) load(userptr, "glCompileShaderARB"); - sf_glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); sf_glad_glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) load(userptr, "glCreateProgramObjectARB"); - sf_glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); sf_glad_glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) load(userptr, "glCreateShaderObjectARB"); sf_glad_glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) load(userptr, "glDeleteObjectARB"); sf_glad_glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC) load(userptr, "glDetachObjectARB"); - sf_glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); - sf_glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); sf_glad_glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC) load(userptr, "glGetActiveUniformARB"); sf_glad_glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC) load(userptr, "glGetAttachedObjectsARB"); sf_glad_glGetHandleARB = (PFNGLGETHANDLEARBPROC) load(userptr, "glGetHandleARB"); sf_glad_glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) load(userptr, "glGetInfoLogARB"); sf_glad_glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC) load(userptr, "glGetObjectParameterfvARB"); sf_glad_glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) load(userptr, "glGetObjectParameterivARB"); - sf_glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); sf_glad_glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC) load(userptr, "glGetShaderSourceARB"); - sf_glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); sf_glad_glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) load(userptr, "glGetUniformLocationARB"); - sf_glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); sf_glad_glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC) load(userptr, "glGetUniformfvARB"); - sf_glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); sf_glad_glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC) load(userptr, "glGetUniformivARB"); - sf_glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); sf_glad_glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) load(userptr, "glLinkProgramARB"); - sf_glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); sf_glad_glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) load(userptr, "glShaderSourceARB"); - sf_glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); sf_glad_glUniform1fARB = (PFNGLUNIFORM1FARBPROC) load(userptr, "glUniform1fARB"); - sf_glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); sf_glad_glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC) load(userptr, "glUniform1fvARB"); - sf_glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); sf_glad_glUniform1iARB = (PFNGLUNIFORM1IARBPROC) load(userptr, "glUniform1iARB"); - sf_glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); sf_glad_glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC) load(userptr, "glUniform1ivARB"); - sf_glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); sf_glad_glUniform2fARB = (PFNGLUNIFORM2FARBPROC) load(userptr, "glUniform2fARB"); - sf_glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); sf_glad_glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC) load(userptr, "glUniform2fvARB"); - sf_glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); sf_glad_glUniform2iARB = (PFNGLUNIFORM2IARBPROC) load(userptr, "glUniform2iARB"); - sf_glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); sf_glad_glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC) load(userptr, "glUniform2ivARB"); - sf_glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); sf_glad_glUniform3fARB = (PFNGLUNIFORM3FARBPROC) load(userptr, "glUniform3fARB"); - sf_glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); sf_glad_glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC) load(userptr, "glUniform3fvARB"); - sf_glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); sf_glad_glUniform3iARB = (PFNGLUNIFORM3IARBPROC) load(userptr, "glUniform3iARB"); - sf_glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); sf_glad_glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC) load(userptr, "glUniform3ivARB"); - sf_glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); sf_glad_glUniform4fARB = (PFNGLUNIFORM4FARBPROC) load(userptr, "glUniform4fARB"); - sf_glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); sf_glad_glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) load(userptr, "glUniform4fvARB"); - sf_glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); sf_glad_glUniform4iARB = (PFNGLUNIFORM4IARBPROC) load(userptr, "glUniform4iARB"); - sf_glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); sf_glad_glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC) load(userptr, "glUniform4ivARB"); - sf_glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); sf_glad_glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC) load(userptr, "glUniformMatrix2fvARB"); - sf_glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); sf_glad_glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC) load(userptr, "glUniformMatrix3fvARB"); - sf_glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); sf_glad_glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC) load(userptr, "glUniformMatrix4fvARB"); - sf_glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); sf_glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) load(userptr, "glUseProgramObjectARB"); - sf_glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); sf_glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC) load(userptr, "glValidateProgramARB"); } +static void sf_glad_gl_load_GL_ARB_shader_storage_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_shader_storage_buffer_object) return; + sf_glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding"); +} +static void sf_glad_gl_load_GL_ARB_shader_subroutine( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_shader_subroutine) return; + sf_glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName"); + sf_glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName"); + sf_glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv"); + sf_glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv"); + sf_glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex"); + sf_glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation"); + sf_glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv"); + sf_glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv"); +} +static void sf_glad_gl_load_GL_ARB_sync( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_sync) return; + sf_glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); + sf_glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); + sf_glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); + sf_glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); + sf_glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); + sf_glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); + sf_glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); +} +static void sf_glad_gl_load_GL_ARB_tessellation_shader( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_tessellation_shader) return; + sf_glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv"); + sf_glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); +} +static void sf_glad_gl_load_GL_ARB_texture_barrier( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_texture_barrier) return; + sf_glad_glTextureBarrier = (PFNGLTEXTUREBARRIERPROC) load(userptr, "glTextureBarrier"); +} +static void sf_glad_gl_load_GL_ARB_texture_buffer_range( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_texture_buffer_range) return; + sf_glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); +} +static void sf_glad_gl_load_GL_ARB_texture_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_texture_multisample) return; + sf_glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC) load(userptr, "glGetMultisamplefv"); + sf_glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC) load(userptr, "glSampleMaski"); + sf_glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC) load(userptr, "glTexImage2DMultisample"); + sf_glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC) load(userptr, "glTexImage3DMultisample"); +} +static void sf_glad_gl_load_GL_ARB_texture_storage( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_texture_storage) return; + sf_glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D"); + sf_glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + sf_glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); +} +static void sf_glad_gl_load_GL_ARB_texture_storage_multisample( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_texture_storage_multisample) return; + sf_glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + sf_glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); +} +static void sf_glad_gl_load_GL_ARB_texture_view( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_texture_view) return; + sf_glad_glTextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView"); +} +static void sf_glad_gl_load_GL_ARB_timer_query( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_timer_query) return; + sf_glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC) load(userptr, "glGetQueryObjecti64v"); + sf_glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC) load(userptr, "glGetQueryObjectui64v"); + sf_glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC) load(userptr, "glQueryCounter"); +} +static void sf_glad_gl_load_GL_ARB_transform_feedback2( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_transform_feedback2) return; + sf_glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + sf_glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + sf_glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback"); + sf_glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + sf_glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + sf_glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + sf_glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); +} +static void sf_glad_gl_load_GL_ARB_transform_feedback3( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_transform_feedback3) return; + sf_glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed"); + sf_glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream"); + sf_glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed"); + sf_glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv"); +} +static void sf_glad_gl_load_GL_ARB_transform_feedback_instanced( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_transform_feedback_instanced) return; + sf_glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced"); + sf_glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced"); +} +static void sf_glad_gl_load_GL_ARB_uniform_buffer_object( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_uniform_buffer_object) return; + sf_glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); + sf_glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); + sf_glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); + sf_glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); + sf_glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC) load(userptr, "glGetActiveUniformName"); + sf_glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); + sf_glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); + sf_glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); + sf_glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); + sf_glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); +} +static void sf_glad_gl_load_GL_ARB_vertex_array_object( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_vertex_array_object) return; + sf_glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); + sf_glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); + sf_glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); + sf_glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); +} +static void sf_glad_gl_load_GL_ARB_vertex_attrib_64bit( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_vertex_attrib_64bit) return; + sf_glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv"); + sf_glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d"); + sf_glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv"); + sf_glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d"); + sf_glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv"); + sf_glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d"); + sf_glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv"); + sf_glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d"); + sf_glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv"); + sf_glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer"); +} +static void sf_glad_gl_load_GL_ARB_vertex_attrib_binding( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_vertex_attrib_binding) return; + sf_glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + sf_glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + sf_glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + sf_glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + sf_glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat"); + sf_glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} static void sf_glad_gl_load_GL_ARB_vertex_buffer_object( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_vertex_buffer_object) return; - sf_glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); sf_glad_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) load(userptr, "glBindBufferARB"); - sf_glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); sf_glad_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) load(userptr, "glBufferDataARB"); - sf_glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); sf_glad_glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC) load(userptr, "glBufferSubDataARB"); - sf_glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); sf_glad_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) load(userptr, "glDeleteBuffersARB"); - sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); sf_glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) load(userptr, "glGenBuffersARB"); - sf_glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); sf_glad_glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC) load(userptr, "glGetBufferParameterivARB"); - sf_glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); sf_glad_glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC) load(userptr, "glGetBufferPointervARB"); - sf_glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC) load(userptr, "glGetBufferSubData"); sf_glad_glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC) load(userptr, "glGetBufferSubDataARB"); - sf_glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); sf_glad_glIsBufferARB = (PFNGLISBUFFERARBPROC) load(userptr, "glIsBufferARB"); - sf_glad_glMapBuffer = (PFNGLMAPBUFFERPROC) load(userptr, "glMapBuffer"); sf_glad_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) load(userptr, "glMapBufferARB"); - sf_glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); sf_glad_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) load(userptr, "glUnmapBufferARB"); } static void sf_glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_vertex_program) return; sf_glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); - sf_glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); - sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); sf_glad_glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC) load(userptr, "glGetProgramEnvParameterdvARB"); @@ -6578,13 +10946,9 @@ static void sf_glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, voi sf_glad_glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) load(userptr, "glGetProgramLocalParameterfvARB"); sf_glad_glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC) load(userptr, "glGetProgramStringARB"); sf_glad_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) load(userptr, "glGetProgramivARB"); - sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); - sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); - sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); - sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); sf_glad_glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC) load(userptr, "glProgramEnvParameter4dARB"); @@ -6596,286 +10960,225 @@ static void sf_glad_gl_load_GL_ARB_vertex_program( GLADuserptrloadfunc load, voi sf_glad_glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC) load(userptr, "glProgramLocalParameter4fARB"); sf_glad_glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) load(userptr, "glProgramLocalParameter4fvARB"); sf_glad_glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC) load(userptr, "glProgramStringARB"); - sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); - sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); - sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); - sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); - sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); - sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); - sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); - sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); - sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); - sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); - sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); - sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); - sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); - sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); - sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); - sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); - sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); - sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); - sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); - sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); - sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); - sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); - sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); - sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); - sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); - sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); - sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); - sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); - sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); - sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); - sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); - sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); - sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); - sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); - sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); - sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); - sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); sf_glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); } static void sf_glad_gl_load_GL_ARB_vertex_shader( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_ARB_vertex_shader) return; - sf_glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); sf_glad_glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) load(userptr, "glBindAttribLocationARB"); - sf_glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); sf_glad_glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glDisableVertexAttribArrayARB"); - sf_glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) load(userptr, "glEnableVertexAttribArrayARB"); - sf_glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); sf_glad_glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) load(userptr, "glGetActiveAttribARB"); - sf_glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); sf_glad_glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) load(userptr, "glGetAttribLocationARB"); - sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC) load(userptr, "glGetVertexAttribPointervARB"); - sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); sf_glad_glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC) load(userptr, "glGetVertexAttribdvARB"); - sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC) load(userptr, "glGetVertexAttribfvARB"); - sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC) load(userptr, "glGetVertexAttribivARB"); - sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) load(userptr, "glVertexAttrib1dARB"); - sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) load(userptr, "glVertexAttrib1dvARB"); - sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC) load(userptr, "glVertexAttrib1fARB"); - sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC) load(userptr, "glVertexAttrib1fvARB"); - sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC) load(userptr, "glVertexAttrib1sARB"); - sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC) load(userptr, "glVertexAttrib1svARB"); - sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC) load(userptr, "glVertexAttrib2dARB"); - sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC) load(userptr, "glVertexAttrib2dvARB"); - sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC) load(userptr, "glVertexAttrib2fARB"); - sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC) load(userptr, "glVertexAttrib2fvARB"); - sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC) load(userptr, "glVertexAttrib2sARB"); - sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC) load(userptr, "glVertexAttrib2svARB"); - sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC) load(userptr, "glVertexAttrib3dARB"); - sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC) load(userptr, "glVertexAttrib3dvARB"); - sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC) load(userptr, "glVertexAttrib3fARB"); - sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC) load(userptr, "glVertexAttrib3fvARB"); - sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC) load(userptr, "glVertexAttrib3sARB"); - sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC) load(userptr, "glVertexAttrib3svARB"); - sf_glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC) load(userptr, "glVertexAttrib4Nbv"); sf_glad_glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC) load(userptr, "glVertexAttrib4NbvARB"); - sf_glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC) load(userptr, "glVertexAttrib4Niv"); sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC) load(userptr, "glVertexAttrib4NivARB"); - sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC) load(userptr, "glVertexAttrib4Nsv"); sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC) load(userptr, "glVertexAttrib4NsvARB"); - sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC) load(userptr, "glVertexAttrib4NubARB"); - sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC) load(userptr, "glVertexAttrib4NubvARB"); - sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC) load(userptr, "glVertexAttrib4Nuiv"); sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC) load(userptr, "glVertexAttrib4NuivARB"); - sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC) load(userptr, "glVertexAttrib4Nusv"); sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC) load(userptr, "glVertexAttrib4NusvARB"); - sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC) load(userptr, "glVertexAttrib4bv"); sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC) load(userptr, "glVertexAttrib4bvARB"); - sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC) load(userptr, "glVertexAttrib4dARB"); - sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC) load(userptr, "glVertexAttrib4dvARB"); - sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC) load(userptr, "glVertexAttrib4fARB"); - sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); sf_glad_glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC) load(userptr, "glVertexAttrib4fvARB"); - sf_glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC) load(userptr, "glVertexAttrib4iv"); sf_glad_glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC) load(userptr, "glVertexAttrib4ivARB"); - sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC) load(userptr, "glVertexAttrib4sARB"); - sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC) load(userptr, "glVertexAttrib4svARB"); - sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC) load(userptr, "glVertexAttrib4ubv"); sf_glad_glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC) load(userptr, "glVertexAttrib4ubvARB"); - sf_glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC) load(userptr, "glVertexAttrib4uiv"); sf_glad_glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC) load(userptr, "glVertexAttrib4uivARB"); - sf_glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC) load(userptr, "glVertexAttrib4usv"); sf_glad_glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC) load(userptr, "glVertexAttrib4usvARB"); - sf_glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); sf_glad_glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) load(userptr, "glVertexAttribPointerARB"); } +static void sf_glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev) return; + sf_glad_glColorP3ui = (PFNGLCOLORP3UIPROC) load(userptr, "glColorP3ui"); + sf_glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC) load(userptr, "glColorP3uiv"); + sf_glad_glColorP4ui = (PFNGLCOLORP4UIPROC) load(userptr, "glColorP4ui"); + sf_glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC) load(userptr, "glColorP4uiv"); + sf_glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC) load(userptr, "glMultiTexCoordP1ui"); + sf_glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC) load(userptr, "glMultiTexCoordP1uiv"); + sf_glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC) load(userptr, "glMultiTexCoordP2ui"); + sf_glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC) load(userptr, "glMultiTexCoordP2uiv"); + sf_glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC) load(userptr, "glMultiTexCoordP3ui"); + sf_glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC) load(userptr, "glMultiTexCoordP3uiv"); + sf_glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC) load(userptr, "glMultiTexCoordP4ui"); + sf_glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC) load(userptr, "glMultiTexCoordP4uiv"); + sf_glad_glNormalP3ui = (PFNGLNORMALP3UIPROC) load(userptr, "glNormalP3ui"); + sf_glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC) load(userptr, "glNormalP3uiv"); + sf_glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC) load(userptr, "glSecondaryColorP3ui"); + sf_glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC) load(userptr, "glSecondaryColorP3uiv"); + sf_glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC) load(userptr, "glTexCoordP1ui"); + sf_glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC) load(userptr, "glTexCoordP1uiv"); + sf_glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC) load(userptr, "glTexCoordP2ui"); + sf_glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC) load(userptr, "glTexCoordP2uiv"); + sf_glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC) load(userptr, "glTexCoordP3ui"); + sf_glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC) load(userptr, "glTexCoordP3uiv"); + sf_glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC) load(userptr, "glTexCoordP4ui"); + sf_glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC) load(userptr, "glTexCoordP4uiv"); + sf_glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC) load(userptr, "glVertexAttribP1ui"); + sf_glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC) load(userptr, "glVertexAttribP1uiv"); + sf_glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC) load(userptr, "glVertexAttribP2ui"); + sf_glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC) load(userptr, "glVertexAttribP2uiv"); + sf_glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC) load(userptr, "glVertexAttribP3ui"); + sf_glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC) load(userptr, "glVertexAttribP3uiv"); + sf_glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); + sf_glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); + sf_glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC) load(userptr, "glVertexP2ui"); + sf_glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC) load(userptr, "glVertexP2uiv"); + sf_glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC) load(userptr, "glVertexP3ui"); + sf_glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC) load(userptr, "glVertexP3uiv"); + sf_glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC) load(userptr, "glVertexP4ui"); + sf_glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC) load(userptr, "glVertexP4uiv"); +} +static void sf_glad_gl_load_GL_ARB_viewport_array( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_ARB_viewport_array) return; + sf_glad_glDepthRangeArraydvNV = (PFNGLDEPTHRANGEARRAYDVNVPROC) load(userptr, "glDepthRangeArraydvNV"); + sf_glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv"); + sf_glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed"); + sf_glad_glDepthRangeIndexeddNV = (PFNGLDEPTHRANGEINDEXEDDNVPROC) load(userptr, "glDepthRangeIndexeddNV"); + sf_glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v"); + sf_glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v"); + sf_glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv"); + sf_glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed"); + sf_glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv"); + sf_glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv"); + sf_glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf"); + sf_glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv"); +} static void sf_glad_gl_load_GL_EXT_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_blend_equation_separate) return; - sf_glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); sf_glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC) load(userptr, "glBlendEquationSeparateEXT"); } static void sf_glad_gl_load_GL_EXT_blend_func_separate( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_blend_func_separate) return; - sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); sf_glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC) load(userptr, "glBlendFuncSeparateEXT"); } static void sf_glad_gl_load_GL_EXT_blend_minmax( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_blend_minmax) return; - sf_glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); sf_glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC) load(userptr, "glBlendEquationEXT"); } static void sf_glad_gl_load_GL_EXT_copy_texture( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_copy_texture) return; - sf_glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC) load(userptr, "glCopyTexImage1D"); sf_glad_glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC) load(userptr, "glCopyTexImage1DEXT"); - sf_glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); sf_glad_glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC) load(userptr, "glCopyTexImage2DEXT"); - sf_glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC) load(userptr, "glCopyTexSubImage1D"); sf_glad_glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC) load(userptr, "glCopyTexSubImage1DEXT"); - sf_glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); sf_glad_glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC) load(userptr, "glCopyTexSubImage2DEXT"); - sf_glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); sf_glad_glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC) load(userptr, "glCopyTexSubImage3DEXT"); } static void sf_glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_framebuffer_blit) return; - sf_glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); sf_glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT"); } static void sf_glad_gl_load_GL_EXT_framebuffer_multisample( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_framebuffer_multisample) return; - sf_glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); sf_glad_glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) load(userptr, "glRenderbufferStorageMultisampleEXT"); } static void sf_glad_gl_load_GL_EXT_framebuffer_object( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_framebuffer_object) return; sf_glad_glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) load(userptr, "glBindFramebufferEXT"); sf_glad_glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) load(userptr, "glBindRenderbufferEXT"); - sf_glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); sf_glad_glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) load(userptr, "glCheckFramebufferStatusEXT"); - sf_glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); sf_glad_glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) load(userptr, "glDeleteFramebuffersEXT"); - sf_glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); sf_glad_glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) load(userptr, "glDeleteRenderbuffersEXT"); - sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); sf_glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) load(userptr, "glFramebufferRenderbufferEXT"); - sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) load(userptr, "glFramebufferTexture1D"); sf_glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) load(userptr, "glFramebufferTexture1DEXT"); - sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); sf_glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) load(userptr, "glFramebufferTexture2DEXT"); - sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) load(userptr, "glFramebufferTexture3D"); sf_glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) load(userptr, "glFramebufferTexture3DEXT"); - sf_glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); sf_glad_glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) load(userptr, "glGenFramebuffersEXT"); - sf_glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); sf_glad_glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) load(userptr, "glGenRenderbuffersEXT"); - sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); sf_glad_glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) load(userptr, "glGenerateMipmapEXT"); - sf_glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); sf_glad_glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) load(userptr, "glGetFramebufferAttachmentParameterivEXT"); - sf_glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); sf_glad_glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) load(userptr, "glGetRenderbufferParameterivEXT"); - sf_glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); sf_glad_glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) load(userptr, "glIsFramebufferEXT"); - sf_glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); sf_glad_glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) load(userptr, "glIsRenderbufferEXT"); - sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); sf_glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) load(userptr, "glRenderbufferStorageEXT"); } static void sf_glad_gl_load_GL_EXT_geometry_shader4( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_geometry_shader4) return; - sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC) load(userptr, "glProgramParameteriEXT"); } static void sf_glad_gl_load_GL_EXT_subtexture( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_subtexture) return; - sf_glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); sf_glad_glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC) load(userptr, "glTexSubImage1DEXT"); - sf_glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); sf_glad_glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC) load(userptr, "glTexSubImage2DEXT"); } static void sf_glad_gl_load_GL_EXT_texture_array( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_texture_array) return; - sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT"); } static void sf_glad_gl_load_GL_EXT_texture_object( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_texture_object) return; sf_glad_glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC) load(userptr, "glAreTexturesResidentEXT"); - sf_glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); sf_glad_glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC) load(userptr, "glBindTextureEXT"); sf_glad_glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC) load(userptr, "glDeleteTexturesEXT"); sf_glad_glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC) load(userptr, "glGenTexturesEXT"); sf_glad_glIsTextureEXT = (PFNGLISTEXTUREEXTPROC) load(userptr, "glIsTextureEXT"); - sf_glad_glPrioritizeTextures = (PFNGLPRIORITIZETEXTURESPROC) load(userptr, "glPrioritizeTextures"); sf_glad_glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC) load(userptr, "glPrioritizeTexturesEXT"); } static void sf_glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_EXT_vertex_array) return; - sf_glad_glArrayElement = (PFNGLARRAYELEMENTPROC) load(userptr, "glArrayElement"); sf_glad_glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC) load(userptr, "glArrayElementEXT"); sf_glad_glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC) load(userptr, "glColorPointerEXT"); - sf_glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); sf_glad_glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC) load(userptr, "glDrawArraysEXT"); sf_glad_glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC) load(userptr, "glEdgeFlagPointerEXT"); - sf_glad_glGetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); sf_glad_glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC) load(userptr, "glGetPointervEXT"); sf_glad_glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC) load(userptr, "glIndexPointerEXT"); sf_glad_glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC) load(userptr, "glNormalPointerEXT"); @@ -6884,7 +11187,6 @@ static void sf_glad_gl_load_GL_EXT_vertex_array( GLADuserptrloadfunc load, void* } static void sf_glad_gl_load_GL_INGR_blend_func_separate( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_INGR_blend_func_separate) return; - sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); sf_glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC) load(userptr, "glBlendFuncSeparateINGR"); } static void sf_glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userptr) { @@ -6901,40 +11203,37 @@ static void sf_glad_gl_load_GL_KHR_debug( GLADuserptrloadfunc load, void* userpt sf_glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); sf_glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); } +static void sf_glad_gl_load_GL_KHR_robustness( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_KHR_robustness) return; + sf_glad_glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC) load(userptr, "glGetGraphicsResetStatus"); + sf_glad_glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC) load(userptr, "glGetnUniformfv"); + sf_glad_glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC) load(userptr, "glGetnUniformiv"); + sf_glad_glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC) load(userptr, "glGetnUniformuiv"); + sf_glad_glReadnPixels = (PFNGLREADNPIXELSPROC) load(userptr, "glReadnPixels"); +} static void sf_glad_gl_load_GL_NV_geometry_program4( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_NV_geometry_program4) return; - sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC) load(userptr, "glFramebufferTexture"); sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC) load(userptr, "glFramebufferTextureEXT"); - sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) load(userptr, "glFramebufferTextureFaceARB"); sf_glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) load(userptr, "glFramebufferTextureFaceEXT"); - sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) load(userptr, "glFramebufferTextureLayerEXT"); sf_glad_glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC) load(userptr, "glProgramVertexLimitNV"); } static void sf_glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_NV_vertex_program) return; sf_glad_glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC) load(userptr, "glAreProgramsResidentNV"); - sf_glad_glBindProgramARB = (PFNGLBINDPROGRAMARBPROC) load(userptr, "glBindProgramARB"); sf_glad_glBindProgramNV = (PFNGLBINDPROGRAMNVPROC) load(userptr, "glBindProgramNV"); - sf_glad_glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC) load(userptr, "glDeleteProgramsARB"); sf_glad_glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC) load(userptr, "glDeleteProgramsNV"); sf_glad_glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC) load(userptr, "glExecuteProgramNV"); - sf_glad_glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC) load(userptr, "glGenProgramsARB"); sf_glad_glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC) load(userptr, "glGenProgramsNV"); sf_glad_glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC) load(userptr, "glGetProgramParameterdvNV"); sf_glad_glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC) load(userptr, "glGetProgramParameterfvNV"); sf_glad_glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC) load(userptr, "glGetProgramStringNV"); sf_glad_glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC) load(userptr, "glGetProgramivNV"); sf_glad_glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC) load(userptr, "glGetTrackMatrixivNV"); - sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC) load(userptr, "glGetVertexAttribPointervNV"); - sf_glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC) load(userptr, "glGetVertexAttribdv"); sf_glad_glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC) load(userptr, "glGetVertexAttribdvNV"); - sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC) load(userptr, "glGetVertexAttribfvNV"); - sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC) load(userptr, "glGetVertexAttribivNV"); - sf_glad_glIsProgramARB = (PFNGLISPROGRAMARBPROC) load(userptr, "glIsProgramARB"); sf_glad_glIsProgramNV = (PFNGLISPROGRAMNVPROC) load(userptr, "glIsProgramNV"); sf_glad_glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC) load(userptr, "glLoadProgramNV"); sf_glad_glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC) load(userptr, "glProgramParameter4dNV"); @@ -6945,55 +11244,29 @@ static void sf_glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void sf_glad_glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC) load(userptr, "glProgramParameters4fvNV"); sf_glad_glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC) load(userptr, "glRequestResidentProgramsNV"); sf_glad_glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC) load(userptr, "glTrackMatrixNV"); - sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC) load(userptr, "glVertexAttrib1d"); sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC) load(userptr, "glVertexAttrib1dNV"); - sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC) load(userptr, "glVertexAttrib1dv"); sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC) load(userptr, "glVertexAttrib1dvNV"); - sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC) load(userptr, "glVertexAttrib1fNV"); - sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC) load(userptr, "glVertexAttrib1fvNV"); - sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC) load(userptr, "glVertexAttrib1s"); sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC) load(userptr, "glVertexAttrib1sNV"); - sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC) load(userptr, "glVertexAttrib1sv"); sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC) load(userptr, "glVertexAttrib1svNV"); - sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC) load(userptr, "glVertexAttrib2d"); sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC) load(userptr, "glVertexAttrib2dNV"); - sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC) load(userptr, "glVertexAttrib2dv"); sf_glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC) load(userptr, "glVertexAttrib2dvNV"); - sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC) load(userptr, "glVertexAttrib2fNV"); - sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC) load(userptr, "glVertexAttrib2fvNV"); - sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC) load(userptr, "glVertexAttrib2s"); sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC) load(userptr, "glVertexAttrib2sNV"); - sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC) load(userptr, "glVertexAttrib2sv"); sf_glad_glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC) load(userptr, "glVertexAttrib2svNV"); - sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC) load(userptr, "glVertexAttrib3d"); sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC) load(userptr, "glVertexAttrib3dNV"); - sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC) load(userptr, "glVertexAttrib3dv"); sf_glad_glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC) load(userptr, "glVertexAttrib3dvNV"); - sf_glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC) load(userptr, "glVertexAttrib3fNV"); - sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC) load(userptr, "glVertexAttrib3fvNV"); - sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC) load(userptr, "glVertexAttrib3s"); sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC) load(userptr, "glVertexAttrib3sNV"); - sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC) load(userptr, "glVertexAttrib3sv"); sf_glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC) load(userptr, "glVertexAttrib3svNV"); - sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC) load(userptr, "glVertexAttrib4Nub"); - sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC) load(userptr, "glVertexAttrib4Nubv"); - sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC) load(userptr, "glVertexAttrib4d"); sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC) load(userptr, "glVertexAttrib4dNV"); - sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC) load(userptr, "glVertexAttrib4dv"); sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC) load(userptr, "glVertexAttrib4dvNV"); - sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); sf_glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC) load(userptr, "glVertexAttrib4fNV"); - sf_glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); sf_glad_glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC) load(userptr, "glVertexAttrib4fvNV"); - sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC) load(userptr, "glVertexAttrib4s"); sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC) load(userptr, "glVertexAttrib4sNV"); - sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC) load(userptr, "glVertexAttrib4sv"); sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC) load(userptr, "glVertexAttrib4svNV"); sf_glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC) load(userptr, "glVertexAttrib4ubNV"); sf_glad_glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC) load(userptr, "glVertexAttrib4ubvNV"); @@ -7012,6 +11285,15 @@ static void sf_glad_gl_load_GL_NV_vertex_program( GLADuserptrloadfunc load, void sf_glad_glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC) load(userptr, "glVertexAttribs4svNV"); sf_glad_glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC) load(userptr, "glVertexAttribs4ubvNV"); } +static void sf_glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) { + if(!SF_GLAD_GL_OES_single_precision) return; + sf_glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES"); + sf_glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES"); + sf_glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES"); + sf_glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES"); + sf_glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES"); + sf_glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES"); +} static void sf_glad_gl_load_GL_OES_blend_equation_separate( GLADuserptrloadfunc load, void* userptr) { if(!SF_GLAD_GL_OES_blend_equation_separate) return; sf_glad_glBlendEquationSeparateOES = (PFNGLBLENDEQUATIONSEPARATEOESPROC) load(userptr, "glBlendEquationSeparateOES"); @@ -7042,17 +11324,6 @@ static void sf_glad_gl_load_GL_OES_framebuffer_object( GLADuserptrloadfunc load, sf_glad_glIsRenderbufferOES = (PFNGLISRENDERBUFFEROESPROC) load(userptr, "glIsRenderbufferOES"); sf_glad_glRenderbufferStorageOES = (PFNGLRENDERBUFFERSTORAGEOESPROC) load(userptr, "glRenderbufferStorageOES"); } -static void sf_glad_gl_load_GL_OES_single_precision( GLADuserptrloadfunc load, void* userptr) { - if(!SF_GLAD_GL_OES_single_precision) return; - sf_glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); - sf_glad_glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC) load(userptr, "glClearDepthfOES"); - sf_glad_glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC) load(userptr, "glClipPlanefOES"); - sf_glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); - sf_glad_glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC) load(userptr, "glDepthRangefOES"); - sf_glad_glFrustumfOES = (PFNGLFRUSTUMFOESPROC) load(userptr, "glFrustumfOES"); - sf_glad_glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC) load(userptr, "glGetClipPlanefOES"); - sf_glad_glOrthofOES = (PFNGLORTHOFOESPROC) load(userptr, "glOrthofOES"); -} static void sf_glad_gl_resolve_aliases(void) { @@ -7074,8 +11345,8 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glBlendEquationEXT == NULL && sf_glad_glBlendEquation != NULL) sf_glad_glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)sf_glad_glBlendEquation; if (sf_glad_glBlendEquationSeparate == NULL && sf_glad_glBlendEquationSeparateEXT != NULL) sf_glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)sf_glad_glBlendEquationSeparateEXT; if (sf_glad_glBlendEquationSeparateEXT == NULL && sf_glad_glBlendEquationSeparate != NULL) sf_glad_glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)sf_glad_glBlendEquationSeparate; - if (sf_glad_glBlendFuncSeparate == NULL && sf_glad_glBlendFuncSeparateINGR != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateINGR; if (sf_glad_glBlendFuncSeparate == NULL && sf_glad_glBlendFuncSeparateEXT != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateEXT; + if (sf_glad_glBlendFuncSeparate == NULL && sf_glad_glBlendFuncSeparateINGR != NULL) sf_glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)sf_glad_glBlendFuncSeparateINGR; if (sf_glad_glBlendFuncSeparateEXT == NULL && sf_glad_glBlendFuncSeparate != NULL) sf_glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)sf_glad_glBlendFuncSeparate; if (sf_glad_glBlendFuncSeparateEXT == NULL && sf_glad_glBlendFuncSeparateINGR != NULL) sf_glad_glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)sf_glad_glBlendFuncSeparateINGR; if (sf_glad_glBlendFuncSeparateINGR == NULL && sf_glad_glBlendFuncSeparate != NULL) sf_glad_glBlendFuncSeparateINGR = (PFNGLBLENDFUNCSEPARATEINGRPROC)sf_glad_glBlendFuncSeparate; @@ -7128,26 +11399,26 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glEnableVertexAttribArrayARB == NULL && sf_glad_glEnableVertexAttribArray != NULL) sf_glad_glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)sf_glad_glEnableVertexAttribArray; if (sf_glad_glFramebufferRenderbuffer == NULL && sf_glad_glFramebufferRenderbufferEXT != NULL) sf_glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)sf_glad_glFramebufferRenderbufferEXT; if (sf_glad_glFramebufferRenderbufferEXT == NULL && sf_glad_glFramebufferRenderbuffer != NULL) sf_glad_glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)sf_glad_glFramebufferRenderbuffer; - if (sf_glad_glFramebufferTexture == NULL && sf_glad_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureEXT; if (sf_glad_glFramebufferTexture == NULL && sf_glad_glFramebufferTextureARB != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureARB; + if (sf_glad_glFramebufferTexture == NULL && sf_glad_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)sf_glad_glFramebufferTextureEXT; if (sf_glad_glFramebufferTexture1D == NULL && sf_glad_glFramebufferTexture1DEXT != NULL) sf_glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)sf_glad_glFramebufferTexture1DEXT; if (sf_glad_glFramebufferTexture1DEXT == NULL && sf_glad_glFramebufferTexture1D != NULL) sf_glad_glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)sf_glad_glFramebufferTexture1D; if (sf_glad_glFramebufferTexture2D == NULL && sf_glad_glFramebufferTexture2DEXT != NULL) sf_glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)sf_glad_glFramebufferTexture2DEXT; if (sf_glad_glFramebufferTexture2DEXT == NULL && sf_glad_glFramebufferTexture2D != NULL) sf_glad_glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)sf_glad_glFramebufferTexture2D; if (sf_glad_glFramebufferTexture3D == NULL && sf_glad_glFramebufferTexture3DEXT != NULL) sf_glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)sf_glad_glFramebufferTexture3DEXT; if (sf_glad_glFramebufferTexture3DEXT == NULL && sf_glad_glFramebufferTexture3D != NULL) sf_glad_glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)sf_glad_glFramebufferTexture3D; - if (sf_glad_glFramebufferTextureARB == NULL && sf_glad_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTextureEXT; if (sf_glad_glFramebufferTextureARB == NULL && sf_glad_glFramebufferTexture != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTexture; + if (sf_glad_glFramebufferTextureARB == NULL && sf_glad_glFramebufferTextureEXT != NULL) sf_glad_glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)sf_glad_glFramebufferTextureEXT; if (sf_glad_glFramebufferTextureEXT == NULL && sf_glad_glFramebufferTexture != NULL) sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)sf_glad_glFramebufferTexture; if (sf_glad_glFramebufferTextureEXT == NULL && sf_glad_glFramebufferTextureARB != NULL) sf_glad_glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)sf_glad_glFramebufferTextureARB; if (sf_glad_glFramebufferTextureFaceARB == NULL && sf_glad_glFramebufferTextureFaceEXT != NULL) sf_glad_glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)sf_glad_glFramebufferTextureFaceEXT; if (sf_glad_glFramebufferTextureFaceEXT == NULL && sf_glad_glFramebufferTextureFaceARB != NULL) sf_glad_glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)sf_glad_glFramebufferTextureFaceARB; if (sf_glad_glFramebufferTextureLayer == NULL && sf_glad_glFramebufferTextureLayerARB != NULL) sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)sf_glad_glFramebufferTextureLayerARB; if (sf_glad_glFramebufferTextureLayer == NULL && sf_glad_glFramebufferTextureLayerEXT != NULL) sf_glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)sf_glad_glFramebufferTextureLayerEXT; - if (sf_glad_glFramebufferTextureLayerARB == NULL && sf_glad_glFramebufferTextureLayerEXT != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayerEXT; if (sf_glad_glFramebufferTextureLayerARB == NULL && sf_glad_glFramebufferTextureLayer != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayer; - if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayerARB != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayerARB; + if (sf_glad_glFramebufferTextureLayerARB == NULL && sf_glad_glFramebufferTextureLayerEXT != NULL) sf_glad_glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)sf_glad_glFramebufferTextureLayerEXT; if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayer != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayer; + if (sf_glad_glFramebufferTextureLayerEXT == NULL && sf_glad_glFramebufferTextureLayerARB != NULL) sf_glad_glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)sf_glad_glFramebufferTextureLayerARB; if (sf_glad_glGenBuffers == NULL && sf_glad_glGenBuffersARB != NULL) sf_glad_glGenBuffers = (PFNGLGENBUFFERSPROC)sf_glad_glGenBuffersARB; if (sf_glad_glGenBuffersARB == NULL && sf_glad_glGenBuffers != NULL) sf_glad_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)sf_glad_glGenBuffers; if (sf_glad_glGenerateMipmap == NULL && sf_glad_glGenerateMipmapEXT != NULL) sf_glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)sf_glad_glGenerateMipmapEXT; @@ -7194,18 +11465,18 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glGetVertexAttribfv == NULL && sf_glad_glGetVertexAttribfvNV != NULL) sf_glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)sf_glad_glGetVertexAttribfvNV; if (sf_glad_glGetVertexAttribfvARB == NULL && sf_glad_glGetVertexAttribfv != NULL) sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)sf_glad_glGetVertexAttribfv; if (sf_glad_glGetVertexAttribfvARB == NULL && sf_glad_glGetVertexAttribfvNV != NULL) sf_glad_glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)sf_glad_glGetVertexAttribfvNV; - if (sf_glad_glGetVertexAttribfvNV == NULL && sf_glad_glGetVertexAttribfvARB != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfvARB; if (sf_glad_glGetVertexAttribfvNV == NULL && sf_glad_glGetVertexAttribfv != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfv; - if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivNV; + if (sf_glad_glGetVertexAttribfvNV == NULL && sf_glad_glGetVertexAttribfvARB != NULL) sf_glad_glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)sf_glad_glGetVertexAttribfvARB; if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivARB != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivARB; - if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribivNV; + if (sf_glad_glGetVertexAttribiv == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)sf_glad_glGetVertexAttribivNV; if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribiv != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribiv; + if (sf_glad_glGetVertexAttribivARB == NULL && sf_glad_glGetVertexAttribivNV != NULL) sf_glad_glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)sf_glad_glGetVertexAttribivNV; if (sf_glad_glGetVertexAttribivNV == NULL && sf_glad_glGetVertexAttribiv != NULL) sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)sf_glad_glGetVertexAttribiv; if (sf_glad_glGetVertexAttribivNV == NULL && sf_glad_glGetVertexAttribivARB != NULL) sf_glad_glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)sf_glad_glGetVertexAttribivARB; - if (sf_glad_glGetVertexAttribPointerv == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervNV; if (sf_glad_glGetVertexAttribPointerv == NULL && sf_glad_glGetVertexAttribPointervARB != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervARB; - if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointervNV; + if (sf_glad_glGetVertexAttribPointerv == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)sf_glad_glGetVertexAttribPointervNV; if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointerv != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointerv; + if (sf_glad_glGetVertexAttribPointervARB == NULL && sf_glad_glGetVertexAttribPointervNV != NULL) sf_glad_glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)sf_glad_glGetVertexAttribPointervNV; if (sf_glad_glGetVertexAttribPointervNV == NULL && sf_glad_glGetVertexAttribPointerv != NULL) sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)sf_glad_glGetVertexAttribPointerv; if (sf_glad_glGetVertexAttribPointervNV == NULL && sf_glad_glGetVertexAttribPointervARB != NULL) sf_glad_glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)sf_glad_glGetVertexAttribPointervARB; if (sf_glad_glIsBuffer == NULL && sf_glad_glIsBufferARB != NULL) sf_glad_glIsBuffer = (PFNGLISBUFFERPROC)sf_glad_glIsBufferARB; @@ -7290,8 +11561,8 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glProgramParameteri == NULL && sf_glad_glProgramParameteriEXT != NULL) sf_glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)sf_glad_glProgramParameteriEXT; if (sf_glad_glProgramParameteriARB == NULL && sf_glad_glProgramParameteri != NULL) sf_glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)sf_glad_glProgramParameteri; if (sf_glad_glProgramParameteriARB == NULL && sf_glad_glProgramParameteriEXT != NULL) sf_glad_glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)sf_glad_glProgramParameteriEXT; - if (sf_glad_glProgramParameteriEXT == NULL && sf_glad_glProgramParameteriARB != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteriARB; if (sf_glad_glProgramParameteriEXT == NULL && sf_glad_glProgramParameteri != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteri; + if (sf_glad_glProgramParameteriEXT == NULL && sf_glad_glProgramParameteriARB != NULL) sf_glad_glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)sf_glad_glProgramParameteriARB; if (sf_glad_glRenderbufferStorage == NULL && sf_glad_glRenderbufferStorageEXT != NULL) sf_glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)sf_glad_glRenderbufferStorageEXT; if (sf_glad_glRenderbufferStorageEXT == NULL && sf_glad_glRenderbufferStorage != NULL) sf_glad_glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)sf_glad_glRenderbufferStorage; if (sf_glad_glRenderbufferStorageMultisample == NULL && sf_glad_glRenderbufferStorageMultisampleEXT != NULL) sf_glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)sf_glad_glRenderbufferStorageMultisampleEXT; @@ -7346,48 +11617,48 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glUseProgramObjectARB == NULL && sf_glad_glUseProgram != NULL) sf_glad_glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)sf_glad_glUseProgram; if (sf_glad_glValidateProgram == NULL && sf_glad_glValidateProgramARB != NULL) sf_glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)sf_glad_glValidateProgramARB; if (sf_glad_glValidateProgramARB == NULL && sf_glad_glValidateProgram != NULL) sf_glad_glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)sf_glad_glValidateProgram; - if (sf_glad_glVertexAttrib1d == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dNV; if (sf_glad_glVertexAttrib1d == NULL && sf_glad_glVertexAttrib1dARB != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dARB; - if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1dNV; + if (sf_glad_glVertexAttrib1d == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)sf_glad_glVertexAttrib1dNV; if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1d != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1d; + if (sf_glad_glVertexAttrib1dARB == NULL && sf_glad_glVertexAttrib1dNV != NULL) sf_glad_glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)sf_glad_glVertexAttrib1dNV; if (sf_glad_glVertexAttrib1dNV == NULL && sf_glad_glVertexAttrib1d != NULL) sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)sf_glad_glVertexAttrib1d; if (sf_glad_glVertexAttrib1dNV == NULL && sf_glad_glVertexAttrib1dARB != NULL) sf_glad_glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)sf_glad_glVertexAttrib1dARB; if (sf_glad_glVertexAttrib1dv == NULL && sf_glad_glVertexAttrib1dvARB != NULL) sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)sf_glad_glVertexAttrib1dvARB; if (sf_glad_glVertexAttrib1dv == NULL && sf_glad_glVertexAttrib1dvNV != NULL) sf_glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)sf_glad_glVertexAttrib1dvNV; - if (sf_glad_glVertexAttrib1dvARB == NULL && sf_glad_glVertexAttrib1dvNV != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dvNV; if (sf_glad_glVertexAttrib1dvARB == NULL && sf_glad_glVertexAttrib1dv != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dv; - if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dvARB != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dvARB; + if (sf_glad_glVertexAttrib1dvARB == NULL && sf_glad_glVertexAttrib1dvNV != NULL) sf_glad_glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)sf_glad_glVertexAttrib1dvNV; if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dv != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dv; - if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fNV; + if (sf_glad_glVertexAttrib1dvNV == NULL && sf_glad_glVertexAttrib1dvARB != NULL) sf_glad_glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)sf_glad_glVertexAttrib1dvARB; if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fARB; - if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1fNV; + if (sf_glad_glVertexAttrib1f == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)sf_glad_glVertexAttrib1fNV; if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1f != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1f; - if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1fARB; + if (sf_glad_glVertexAttrib1fARB == NULL && sf_glad_glVertexAttrib1fNV != NULL) sf_glad_glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)sf_glad_glVertexAttrib1fNV; if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1f != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1f; + if (sf_glad_glVertexAttrib1fNV == NULL && sf_glad_glVertexAttrib1fARB != NULL) sf_glad_glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)sf_glad_glVertexAttrib1fARB; if (sf_glad_glVertexAttrib1fv == NULL && sf_glad_glVertexAttrib1fvARB != NULL) sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)sf_glad_glVertexAttrib1fvARB; if (sf_glad_glVertexAttrib1fv == NULL && sf_glad_glVertexAttrib1fvNV != NULL) sf_glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)sf_glad_glVertexAttrib1fvNV; - if (sf_glad_glVertexAttrib1fvARB == NULL && sf_glad_glVertexAttrib1fvNV != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fvNV; if (sf_glad_glVertexAttrib1fvARB == NULL && sf_glad_glVertexAttrib1fv != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fv; - if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fvARB != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fvARB; + if (sf_glad_glVertexAttrib1fvARB == NULL && sf_glad_glVertexAttrib1fvNV != NULL) sf_glad_glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)sf_glad_glVertexAttrib1fvNV; if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fv != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fv; - if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sNV; + if (sf_glad_glVertexAttrib1fvNV == NULL && sf_glad_glVertexAttrib1fvARB != NULL) sf_glad_glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)sf_glad_glVertexAttrib1fvARB; if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sARB != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sARB; - if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1sNV; + if (sf_glad_glVertexAttrib1s == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)sf_glad_glVertexAttrib1sNV; if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1s != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1s; + if (sf_glad_glVertexAttrib1sARB == NULL && sf_glad_glVertexAttrib1sNV != NULL) sf_glad_glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)sf_glad_glVertexAttrib1sNV; if (sf_glad_glVertexAttrib1sNV == NULL && sf_glad_glVertexAttrib1s != NULL) sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)sf_glad_glVertexAttrib1s; if (sf_glad_glVertexAttrib1sNV == NULL && sf_glad_glVertexAttrib1sARB != NULL) sf_glad_glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)sf_glad_glVertexAttrib1sARB; - if (sf_glad_glVertexAttrib1sv == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svNV; if (sf_glad_glVertexAttrib1sv == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svARB; - if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1svNV; + if (sf_glad_glVertexAttrib1sv == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)sf_glad_glVertexAttrib1svNV; if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1sv != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1sv; - if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1svARB; + if (sf_glad_glVertexAttrib1svARB == NULL && sf_glad_glVertexAttrib1svNV != NULL) sf_glad_glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)sf_glad_glVertexAttrib1svNV; if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1sv != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1sv; + if (sf_glad_glVertexAttrib1svNV == NULL && sf_glad_glVertexAttrib1svARB != NULL) sf_glad_glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)sf_glad_glVertexAttrib1svARB; if (sf_glad_glVertexAttrib2d == NULL && sf_glad_glVertexAttrib2dARB != NULL) sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)sf_glad_glVertexAttrib2dARB; if (sf_glad_glVertexAttrib2d == NULL && sf_glad_glVertexAttrib2dNV != NULL) sf_glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)sf_glad_glVertexAttrib2dNV; if (sf_glad_glVertexAttrib2dARB == NULL && sf_glad_glVertexAttrib2d != NULL) sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)sf_glad_glVertexAttrib2d; if (sf_glad_glVertexAttrib2dARB == NULL && sf_glad_glVertexAttrib2dNV != NULL) sf_glad_glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)sf_glad_glVertexAttrib2dNV; - if (sf_glad_glVertexAttrib2dNV == NULL && sf_glad_glVertexAttrib2dARB != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2dARB; if (sf_glad_glVertexAttrib2dNV == NULL && sf_glad_glVertexAttrib2d != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2d; + if (sf_glad_glVertexAttrib2dNV == NULL && sf_glad_glVertexAttrib2dARB != NULL) sf_glad_glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)sf_glad_glVertexAttrib2dARB; if (sf_glad_glVertexAttrib2dv == NULL && sf_glad_glVertexAttrib2dvARB != NULL) sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)sf_glad_glVertexAttrib2dvARB; if (sf_glad_glVertexAttrib2dv == NULL && sf_glad_glVertexAttrib2dvNV != NULL) sf_glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)sf_glad_glVertexAttrib2dvNV; if (sf_glad_glVertexAttrib2dvARB == NULL && sf_glad_glVertexAttrib2dv != NULL) sf_glad_glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)sf_glad_glVertexAttrib2dv; @@ -7396,22 +11667,22 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glVertexAttrib2dvNV == NULL && sf_glad_glVertexAttrib2dvARB != NULL) sf_glad_glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)sf_glad_glVertexAttrib2dvARB; if (sf_glad_glVertexAttrib2f == NULL && sf_glad_glVertexAttrib2fARB != NULL) sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)sf_glad_glVertexAttrib2fARB; if (sf_glad_glVertexAttrib2f == NULL && sf_glad_glVertexAttrib2fNV != NULL) sf_glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)sf_glad_glVertexAttrib2fNV; - if (sf_glad_glVertexAttrib2fARB == NULL && sf_glad_glVertexAttrib2fNV != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2fNV; if (sf_glad_glVertexAttrib2fARB == NULL && sf_glad_glVertexAttrib2f != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2f; - if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2fARB != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2fARB; + if (sf_glad_glVertexAttrib2fARB == NULL && sf_glad_glVertexAttrib2fNV != NULL) sf_glad_glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)sf_glad_glVertexAttrib2fNV; if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2f != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2f; - if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvNV; + if (sf_glad_glVertexAttrib2fNV == NULL && sf_glad_glVertexAttrib2fARB != NULL) sf_glad_glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)sf_glad_glVertexAttrib2fARB; if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvARB; - if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fvNV; + if (sf_glad_glVertexAttrib2fv == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)sf_glad_glVertexAttrib2fvNV; if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fv != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fv; - if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fvARB; + if (sf_glad_glVertexAttrib2fvARB == NULL && sf_glad_glVertexAttrib2fvNV != NULL) sf_glad_glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)sf_glad_glVertexAttrib2fvNV; if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fv != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fv; + if (sf_glad_glVertexAttrib2fvNV == NULL && sf_glad_glVertexAttrib2fvARB != NULL) sf_glad_glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)sf_glad_glVertexAttrib2fvARB; if (sf_glad_glVertexAttrib2s == NULL && sf_glad_glVertexAttrib2sARB != NULL) sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)sf_glad_glVertexAttrib2sARB; if (sf_glad_glVertexAttrib2s == NULL && sf_glad_glVertexAttrib2sNV != NULL) sf_glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)sf_glad_glVertexAttrib2sNV; if (sf_glad_glVertexAttrib2sARB == NULL && sf_glad_glVertexAttrib2s != NULL) sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)sf_glad_glVertexAttrib2s; if (sf_glad_glVertexAttrib2sARB == NULL && sf_glad_glVertexAttrib2sNV != NULL) sf_glad_glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)sf_glad_glVertexAttrib2sNV; - if (sf_glad_glVertexAttrib2sNV == NULL && sf_glad_glVertexAttrib2sARB != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2sARB; if (sf_glad_glVertexAttrib2sNV == NULL && sf_glad_glVertexAttrib2s != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2s; + if (sf_glad_glVertexAttrib2sNV == NULL && sf_glad_glVertexAttrib2sARB != NULL) sf_glad_glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)sf_glad_glVertexAttrib2sARB; if (sf_glad_glVertexAttrib2sv == NULL && sf_glad_glVertexAttrib2svARB != NULL) sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)sf_glad_glVertexAttrib2svARB; if (sf_glad_glVertexAttrib2sv == NULL && sf_glad_glVertexAttrib2svNV != NULL) sf_glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)sf_glad_glVertexAttrib2svNV; if (sf_glad_glVertexAttrib2svARB == NULL && sf_glad_glVertexAttrib2sv != NULL) sf_glad_glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)sf_glad_glVertexAttrib2sv; @@ -7422,8 +11693,8 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glVertexAttrib3d == NULL && sf_glad_glVertexAttrib3dNV != NULL) sf_glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)sf_glad_glVertexAttrib3dNV; if (sf_glad_glVertexAttrib3dARB == NULL && sf_glad_glVertexAttrib3d != NULL) sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)sf_glad_glVertexAttrib3d; if (sf_glad_glVertexAttrib3dARB == NULL && sf_glad_glVertexAttrib3dNV != NULL) sf_glad_glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)sf_glad_glVertexAttrib3dNV; - if (sf_glad_glVertexAttrib3dNV == NULL && sf_glad_glVertexAttrib3dARB != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3dARB; if (sf_glad_glVertexAttrib3dNV == NULL && sf_glad_glVertexAttrib3d != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3d; + if (sf_glad_glVertexAttrib3dNV == NULL && sf_glad_glVertexAttrib3dARB != NULL) sf_glad_glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)sf_glad_glVertexAttrib3dARB; if (sf_glad_glVertexAttrib3dv == NULL && sf_glad_glVertexAttrib3dvARB != NULL) sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)sf_glad_glVertexAttrib3dvARB; if (sf_glad_glVertexAttrib3dv == NULL && sf_glad_glVertexAttrib3dvNV != NULL) sf_glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)sf_glad_glVertexAttrib3dvNV; if (sf_glad_glVertexAttrib3dvARB == NULL && sf_glad_glVertexAttrib3dv != NULL) sf_glad_glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)sf_glad_glVertexAttrib3dv; @@ -7436,18 +11707,18 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glVertexAttrib3fARB == NULL && sf_glad_glVertexAttrib3fNV != NULL) sf_glad_glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)sf_glad_glVertexAttrib3fNV; if (sf_glad_glVertexAttrib3fNV == NULL && sf_glad_glVertexAttrib3f != NULL) sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)sf_glad_glVertexAttrib3f; if (sf_glad_glVertexAttrib3fNV == NULL && sf_glad_glVertexAttrib3fARB != NULL) sf_glad_glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)sf_glad_glVertexAttrib3fARB; - if (sf_glad_glVertexAttrib3fv == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvNV; if (sf_glad_glVertexAttrib3fv == NULL && sf_glad_glVertexAttrib3fvARB != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvARB; - if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fvNV; + if (sf_glad_glVertexAttrib3fv == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)sf_glad_glVertexAttrib3fvNV; if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fv != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fv; + if (sf_glad_glVertexAttrib3fvARB == NULL && sf_glad_glVertexAttrib3fvNV != NULL) sf_glad_glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)sf_glad_glVertexAttrib3fvNV; if (sf_glad_glVertexAttrib3fvNV == NULL && sf_glad_glVertexAttrib3fv != NULL) sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)sf_glad_glVertexAttrib3fv; if (sf_glad_glVertexAttrib3fvNV == NULL && sf_glad_glVertexAttrib3fvARB != NULL) sf_glad_glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)sf_glad_glVertexAttrib3fvARB; if (sf_glad_glVertexAttrib3s == NULL && sf_glad_glVertexAttrib3sARB != NULL) sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)sf_glad_glVertexAttrib3sARB; if (sf_glad_glVertexAttrib3s == NULL && sf_glad_glVertexAttrib3sNV != NULL) sf_glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)sf_glad_glVertexAttrib3sNV; if (sf_glad_glVertexAttrib3sARB == NULL && sf_glad_glVertexAttrib3s != NULL) sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)sf_glad_glVertexAttrib3s; if (sf_glad_glVertexAttrib3sARB == NULL && sf_glad_glVertexAttrib3sNV != NULL) sf_glad_glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)sf_glad_glVertexAttrib3sNV; - if (sf_glad_glVertexAttrib3sNV == NULL && sf_glad_glVertexAttrib3sARB != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3sARB; if (sf_glad_glVertexAttrib3sNV == NULL && sf_glad_glVertexAttrib3s != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3s; + if (sf_glad_glVertexAttrib3sNV == NULL && sf_glad_glVertexAttrib3sARB != NULL) sf_glad_glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)sf_glad_glVertexAttrib3sARB; if (sf_glad_glVertexAttrib3sv == NULL && sf_glad_glVertexAttrib3svARB != NULL) sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)sf_glad_glVertexAttrib3svARB; if (sf_glad_glVertexAttrib3sv == NULL && sf_glad_glVertexAttrib3svNV != NULL) sf_glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)sf_glad_glVertexAttrib3svNV; if (sf_glad_glVertexAttrib3svARB == NULL && sf_glad_glVertexAttrib3sv != NULL) sf_glad_glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)sf_glad_glVertexAttrib3sv; @@ -7456,20 +11727,20 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glVertexAttrib3svNV == NULL && sf_glad_glVertexAttrib3svARB != NULL) sf_glad_glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)sf_glad_glVertexAttrib3svARB; if (sf_glad_glVertexAttrib4bv == NULL && sf_glad_glVertexAttrib4bvARB != NULL) sf_glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)sf_glad_glVertexAttrib4bvARB; if (sf_glad_glVertexAttrib4bvARB == NULL && sf_glad_glVertexAttrib4bv != NULL) sf_glad_glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)sf_glad_glVertexAttrib4bv; - if (sf_glad_glVertexAttrib4d == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dNV; if (sf_glad_glVertexAttrib4d == NULL && sf_glad_glVertexAttrib4dARB != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dARB; - if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4dNV; + if (sf_glad_glVertexAttrib4d == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)sf_glad_glVertexAttrib4dNV; if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4d != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4d; + if (sf_glad_glVertexAttrib4dARB == NULL && sf_glad_glVertexAttrib4dNV != NULL) sf_glad_glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)sf_glad_glVertexAttrib4dNV; if (sf_glad_glVertexAttrib4dNV == NULL && sf_glad_glVertexAttrib4d != NULL) sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)sf_glad_glVertexAttrib4d; if (sf_glad_glVertexAttrib4dNV == NULL && sf_glad_glVertexAttrib4dARB != NULL) sf_glad_glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)sf_glad_glVertexAttrib4dARB; - if (sf_glad_glVertexAttrib4dv == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvNV; if (sf_glad_glVertexAttrib4dv == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvARB; - if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dvNV; + if (sf_glad_glVertexAttrib4dv == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)sf_glad_glVertexAttrib4dvNV; if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dv != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dv; - if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dvARB; + if (sf_glad_glVertexAttrib4dvARB == NULL && sf_glad_glVertexAttrib4dvNV != NULL) sf_glad_glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)sf_glad_glVertexAttrib4dvNV; if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dv != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dv; - if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fNV != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fNV; + if (sf_glad_glVertexAttrib4dvNV == NULL && sf_glad_glVertexAttrib4dvARB != NULL) sf_glad_glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)sf_glad_glVertexAttrib4dvARB; if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fARB != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fARB; + if (sf_glad_glVertexAttrib4f == NULL && sf_glad_glVertexAttrib4fNV != NULL) sf_glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)sf_glad_glVertexAttrib4fNV; if (sf_glad_glVertexAttrib4fARB == NULL && sf_glad_glVertexAttrib4f != NULL) sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)sf_glad_glVertexAttrib4f; if (sf_glad_glVertexAttrib4fARB == NULL && sf_glad_glVertexAttrib4fNV != NULL) sf_glad_glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)sf_glad_glVertexAttrib4fNV; if (sf_glad_glVertexAttrib4fNV == NULL && sf_glad_glVertexAttrib4f != NULL) sf_glad_glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)sf_glad_glVertexAttrib4f; @@ -7488,30 +11759,30 @@ static void sf_glad_gl_resolve_aliases(void) { if (sf_glad_glVertexAttrib4NivARB == NULL && sf_glad_glVertexAttrib4Niv != NULL) sf_glad_glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)sf_glad_glVertexAttrib4Niv; if (sf_glad_glVertexAttrib4Nsv == NULL && sf_glad_glVertexAttrib4NsvARB != NULL) sf_glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)sf_glad_glVertexAttrib4NsvARB; if (sf_glad_glVertexAttrib4NsvARB == NULL && sf_glad_glVertexAttrib4Nsv != NULL) sf_glad_glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)sf_glad_glVertexAttrib4Nsv; - if (sf_glad_glVertexAttrib4Nub == NULL && sf_glad_glVertexAttrib4ubNV != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4ubNV; if (sf_glad_glVertexAttrib4Nub == NULL && sf_glad_glVertexAttrib4NubARB != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4NubARB; + if (sf_glad_glVertexAttrib4Nub == NULL && sf_glad_glVertexAttrib4ubNV != NULL) sf_glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)sf_glad_glVertexAttrib4ubNV; if (sf_glad_glVertexAttrib4NubARB == NULL && sf_glad_glVertexAttrib4Nub != NULL) sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)sf_glad_glVertexAttrib4Nub; if (sf_glad_glVertexAttrib4NubARB == NULL && sf_glad_glVertexAttrib4ubNV != NULL) sf_glad_glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)sf_glad_glVertexAttrib4ubNV; - if (sf_glad_glVertexAttrib4Nubv == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4ubvNV; if (sf_glad_glVertexAttrib4Nubv == NULL && sf_glad_glVertexAttrib4NubvARB != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4NubvARB; - if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4ubvNV; + if (sf_glad_glVertexAttrib4Nubv == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)sf_glad_glVertexAttrib4ubvNV; if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4Nubv != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4Nubv; + if (sf_glad_glVertexAttrib4NubvARB == NULL && sf_glad_glVertexAttrib4ubvNV != NULL) sf_glad_glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)sf_glad_glVertexAttrib4ubvNV; if (sf_glad_glVertexAttrib4Nuiv == NULL && sf_glad_glVertexAttrib4NuivARB != NULL) sf_glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)sf_glad_glVertexAttrib4NuivARB; if (sf_glad_glVertexAttrib4NuivARB == NULL && sf_glad_glVertexAttrib4Nuiv != NULL) sf_glad_glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)sf_glad_glVertexAttrib4Nuiv; if (sf_glad_glVertexAttrib4Nusv == NULL && sf_glad_glVertexAttrib4NusvARB != NULL) sf_glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)sf_glad_glVertexAttrib4NusvARB; if (sf_glad_glVertexAttrib4NusvARB == NULL && sf_glad_glVertexAttrib4Nusv != NULL) sf_glad_glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)sf_glad_glVertexAttrib4Nusv; - if (sf_glad_glVertexAttrib4s == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sNV; if (sf_glad_glVertexAttrib4s == NULL && sf_glad_glVertexAttrib4sARB != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sARB; - if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4sNV; + if (sf_glad_glVertexAttrib4s == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)sf_glad_glVertexAttrib4sNV; if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4s != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4s; + if (sf_glad_glVertexAttrib4sARB == NULL && sf_glad_glVertexAttrib4sNV != NULL) sf_glad_glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)sf_glad_glVertexAttrib4sNV; if (sf_glad_glVertexAttrib4sNV == NULL && sf_glad_glVertexAttrib4s != NULL) sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)sf_glad_glVertexAttrib4s; if (sf_glad_glVertexAttrib4sNV == NULL && sf_glad_glVertexAttrib4sARB != NULL) sf_glad_glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)sf_glad_glVertexAttrib4sARB; if (sf_glad_glVertexAttrib4sv == NULL && sf_glad_glVertexAttrib4svARB != NULL) sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)sf_glad_glVertexAttrib4svARB; if (sf_glad_glVertexAttrib4sv == NULL && sf_glad_glVertexAttrib4svNV != NULL) sf_glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)sf_glad_glVertexAttrib4svNV; if (sf_glad_glVertexAttrib4svARB == NULL && sf_glad_glVertexAttrib4sv != NULL) sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)sf_glad_glVertexAttrib4sv; if (sf_glad_glVertexAttrib4svARB == NULL && sf_glad_glVertexAttrib4svNV != NULL) sf_glad_glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)sf_glad_glVertexAttrib4svNV; - if (sf_glad_glVertexAttrib4svNV == NULL && sf_glad_glVertexAttrib4svARB != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4svARB; if (sf_glad_glVertexAttrib4svNV == NULL && sf_glad_glVertexAttrib4sv != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4sv; + if (sf_glad_glVertexAttrib4svNV == NULL && sf_glad_glVertexAttrib4svARB != NULL) sf_glad_glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)sf_glad_glVertexAttrib4svARB; if (sf_glad_glVertexAttrib4ubNV == NULL && sf_glad_glVertexAttrib4Nub != NULL) sf_glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)sf_glad_glVertexAttrib4Nub; if (sf_glad_glVertexAttrib4ubNV == NULL && sf_glad_glVertexAttrib4NubARB != NULL) sf_glad_glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)sf_glad_glVertexAttrib4NubARB; if (sf_glad_glVertexAttrib4ubv == NULL && sf_glad_glVertexAttrib4ubvARB != NULL) sf_glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)sf_glad_glVertexAttrib4ubvARB; @@ -7630,20 +11901,69 @@ static int sf_glad_gl_find_extensions_gl( int version) { char **exts_i = NULL; if (!sf_glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0; + SF_GLAD_GL_ARB_ES2_compatibility = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_ES2_compatibility"); + SF_GLAD_GL_ARB_ES3_1_compatibility = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_ES3_1_compatibility"); + SF_GLAD_GL_ARB_base_instance = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_base_instance"); + SF_GLAD_GL_ARB_blend_func_extended = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_blend_func_extended"); + SF_GLAD_GL_ARB_buffer_storage = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_buffer_storage"); + SF_GLAD_GL_ARB_clear_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_clear_buffer_object"); + SF_GLAD_GL_ARB_clear_texture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_clear_texture"); + SF_GLAD_GL_ARB_clip_control = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_clip_control"); + SF_GLAD_GL_ARB_compute_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_compute_shader"); SF_GLAD_GL_ARB_copy_buffer = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_buffer"); + SF_GLAD_GL_ARB_copy_image = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_copy_image"); + SF_GLAD_GL_ARB_direct_state_access = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_direct_state_access"); + SF_GLAD_GL_ARB_draw_elements_base_vertex = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_draw_elements_base_vertex"); + SF_GLAD_GL_ARB_draw_indirect = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_draw_indirect"); + SF_GLAD_GL_ARB_fragment_program = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_program"); SF_GLAD_GL_ARB_fragment_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_fragment_shader"); + SF_GLAD_GL_ARB_framebuffer_no_attachments = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_no_attachments"); SF_GLAD_GL_ARB_framebuffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_object"); SF_GLAD_GL_ARB_geometry_shader4 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_geometry_shader4"); SF_GLAD_GL_ARB_get_program_binary = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_program_binary"); + SF_GLAD_GL_ARB_get_texture_sub_image = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_texture_sub_image"); + SF_GLAD_GL_ARB_gpu_shader_fp64 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_gpu_shader_fp64"); SF_GLAD_GL_ARB_imaging = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_imaging"); + SF_GLAD_GL_ARB_internalformat_query = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_internalformat_query"); + SF_GLAD_GL_ARB_internalformat_query2 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_internalformat_query2"); + SF_GLAD_GL_ARB_invalidate_subdata = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_invalidate_subdata"); + SF_GLAD_GL_ARB_map_buffer_range = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_map_buffer_range"); + SF_GLAD_GL_ARB_multi_bind = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multi_bind"); + SF_GLAD_GL_ARB_multi_draw_indirect = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multi_draw_indirect"); SF_GLAD_GL_ARB_multitexture = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_multitexture"); + SF_GLAD_GL_ARB_polygon_offset_clamp = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_polygon_offset_clamp"); + SF_GLAD_GL_ARB_program_interface_query = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_program_interface_query"); + SF_GLAD_GL_ARB_provoking_vertex = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_provoking_vertex"); + SF_GLAD_GL_ARB_sampler_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_sampler_objects"); SF_GLAD_GL_ARB_separate_shader_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_separate_shader_objects"); + SF_GLAD_GL_ARB_shader_atomic_counters = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_atomic_counters"); + SF_GLAD_GL_ARB_shader_image_load_store = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_image_load_store"); SF_GLAD_GL_ARB_shader_objects = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_objects"); + SF_GLAD_GL_ARB_shader_storage_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_storage_buffer_object"); + SF_GLAD_GL_ARB_shader_subroutine = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shader_subroutine"); SF_GLAD_GL_ARB_shading_language_100 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_shading_language_100"); + SF_GLAD_GL_ARB_sync = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_sync"); + SF_GLAD_GL_ARB_tessellation_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_tessellation_shader"); + SF_GLAD_GL_ARB_texture_barrier = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_barrier"); + SF_GLAD_GL_ARB_texture_buffer_range = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_buffer_range"); + SF_GLAD_GL_ARB_texture_multisample = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_multisample"); SF_GLAD_GL_ARB_texture_non_power_of_two = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_non_power_of_two"); + SF_GLAD_GL_ARB_texture_storage = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_storage"); + SF_GLAD_GL_ARB_texture_storage_multisample = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_storage_multisample"); + SF_GLAD_GL_ARB_texture_view = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_texture_view"); + SF_GLAD_GL_ARB_timer_query = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_timer_query"); + SF_GLAD_GL_ARB_transform_feedback2 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_transform_feedback2"); + SF_GLAD_GL_ARB_transform_feedback3 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_transform_feedback3"); + SF_GLAD_GL_ARB_transform_feedback_instanced = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_transform_feedback_instanced"); + SF_GLAD_GL_ARB_uniform_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_uniform_buffer_object"); + SF_GLAD_GL_ARB_vertex_array_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_array_object"); + SF_GLAD_GL_ARB_vertex_attrib_64bit = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_attrib_64bit"); + SF_GLAD_GL_ARB_vertex_attrib_binding = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_attrib_binding"); SF_GLAD_GL_ARB_vertex_buffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_buffer_object"); SF_GLAD_GL_ARB_vertex_program = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_program"); SF_GLAD_GL_ARB_vertex_shader = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_shader"); + SF_GLAD_GL_ARB_vertex_type_2_10_10_10_rev = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_vertex_type_2_10_10_10_rev"); + SF_GLAD_GL_ARB_viewport_array = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_viewport_array"); SF_GLAD_GL_EXT_blend_equation_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_equation_separate"); SF_GLAD_GL_EXT_blend_func_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_func_separate"); SF_GLAD_GL_EXT_blend_minmax = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax"); @@ -7661,10 +11981,11 @@ static int sf_glad_gl_find_extensions_gl( int version) { SF_GLAD_GL_EXT_vertex_array = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_vertex_array"); SF_GLAD_GL_INGR_blend_func_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_INGR_blend_func_separate"); SF_GLAD_GL_KHR_debug = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug"); + SF_GLAD_GL_KHR_robustness = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_robustness"); SF_GLAD_GL_NV_geometry_program4 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_geometry_program4"); SF_GLAD_GL_NV_vertex_program = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_NV_vertex_program"); - SF_GLAD_GL_SGIS_texture_edge_clamp = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp") | sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_texture_edge_clamp"); SF_GLAD_GL_OES_single_precision = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision"); + SF_GLAD_GL_SGIS_texture_edge_clamp = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_SGIS_texture_edge_clamp"); sf_glad_gl_free_extensions(exts_i, num_exts_i); @@ -7694,6 +12015,23 @@ static int sf_glad_gl_find_core_gl(void) { SF_GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; SF_GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + SF_GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + SF_GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + SF_GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + SF_GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + SF_GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + SF_GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; + SF_GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + SF_GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + SF_GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + SF_GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + SF_GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4; + SF_GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4; + SF_GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4; + SF_GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4; + SF_GLAD_GL_VERSION_4_4 = (major == 4 && minor >= 4) || major > 4; + SF_GLAD_GL_VERSION_4_5 = (major == 4 && minor >= 5) || major > 4; + SF_GLAD_GL_VERSION_4_6 = (major == 4 && minor >= 6) || major > 4; return GLAD_MAKE_VERSION(major, minor); } @@ -7708,19 +12046,85 @@ static int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { sf_glad_gl_load_GL_VERSION_1_0(load, userptr); sf_glad_gl_load_GL_VERSION_1_1(load, userptr); + sf_glad_gl_load_GL_VERSION_1_2(load, userptr); + sf_glad_gl_load_GL_VERSION_1_3(load, userptr); + sf_glad_gl_load_GL_VERSION_1_4(load, userptr); + sf_glad_gl_load_GL_VERSION_1_5(load, userptr); + sf_glad_gl_load_GL_VERSION_2_0(load, userptr); + sf_glad_gl_load_GL_VERSION_2_1(load, userptr); + sf_glad_gl_load_GL_VERSION_3_0(load, userptr); + sf_glad_gl_load_GL_VERSION_3_1(load, userptr); + sf_glad_gl_load_GL_VERSION_3_2(load, userptr); + sf_glad_gl_load_GL_VERSION_3_3(load, userptr); + sf_glad_gl_load_GL_VERSION_4_0(load, userptr); + sf_glad_gl_load_GL_VERSION_4_1(load, userptr); + sf_glad_gl_load_GL_VERSION_4_2(load, userptr); + sf_glad_gl_load_GL_VERSION_4_3(load, userptr); + sf_glad_gl_load_GL_VERSION_4_4(load, userptr); + sf_glad_gl_load_GL_VERSION_4_5(load, userptr); + sf_glad_gl_load_GL_VERSION_4_6(load, userptr); if (!sf_glad_gl_find_extensions_gl(version)) return 0; + sf_glad_gl_load_GL_ARB_ES2_compatibility(load, userptr); + sf_glad_gl_load_GL_ARB_ES3_1_compatibility(load, userptr); + sf_glad_gl_load_GL_ARB_base_instance(load, userptr); + sf_glad_gl_load_GL_ARB_blend_func_extended(load, userptr); + sf_glad_gl_load_GL_ARB_buffer_storage(load, userptr); + sf_glad_gl_load_GL_ARB_clear_buffer_object(load, userptr); + sf_glad_gl_load_GL_ARB_clear_texture(load, userptr); + sf_glad_gl_load_GL_ARB_clip_control(load, userptr); + sf_glad_gl_load_GL_ARB_compute_shader(load, userptr); sf_glad_gl_load_GL_ARB_copy_buffer(load, userptr); + sf_glad_gl_load_GL_ARB_copy_image(load, userptr); + sf_glad_gl_load_GL_ARB_direct_state_access(load, userptr); + sf_glad_gl_load_GL_ARB_draw_elements_base_vertex(load, userptr); + sf_glad_gl_load_GL_ARB_draw_indirect(load, userptr); + sf_glad_gl_load_GL_ARB_fragment_program(load, userptr); + sf_glad_gl_load_GL_ARB_framebuffer_no_attachments(load, userptr); sf_glad_gl_load_GL_ARB_framebuffer_object(load, userptr); sf_glad_gl_load_GL_ARB_geometry_shader4(load, userptr); sf_glad_gl_load_GL_ARB_get_program_binary(load, userptr); + sf_glad_gl_load_GL_ARB_get_texture_sub_image(load, userptr); + sf_glad_gl_load_GL_ARB_gpu_shader_fp64(load, userptr); sf_glad_gl_load_GL_ARB_imaging(load, userptr); + sf_glad_gl_load_GL_ARB_internalformat_query(load, userptr); + sf_glad_gl_load_GL_ARB_internalformat_query2(load, userptr); + sf_glad_gl_load_GL_ARB_invalidate_subdata(load, userptr); + sf_glad_gl_load_GL_ARB_map_buffer_range(load, userptr); + sf_glad_gl_load_GL_ARB_multi_bind(load, userptr); + sf_glad_gl_load_GL_ARB_multi_draw_indirect(load, userptr); sf_glad_gl_load_GL_ARB_multitexture(load, userptr); + sf_glad_gl_load_GL_ARB_polygon_offset_clamp(load, userptr); + sf_glad_gl_load_GL_ARB_program_interface_query(load, userptr); + sf_glad_gl_load_GL_ARB_provoking_vertex(load, userptr); + sf_glad_gl_load_GL_ARB_sampler_objects(load, userptr); sf_glad_gl_load_GL_ARB_separate_shader_objects(load, userptr); + sf_glad_gl_load_GL_ARB_shader_atomic_counters(load, userptr); + sf_glad_gl_load_GL_ARB_shader_image_load_store(load, userptr); sf_glad_gl_load_GL_ARB_shader_objects(load, userptr); + sf_glad_gl_load_GL_ARB_shader_storage_buffer_object(load, userptr); + sf_glad_gl_load_GL_ARB_shader_subroutine(load, userptr); + sf_glad_gl_load_GL_ARB_sync(load, userptr); + sf_glad_gl_load_GL_ARB_tessellation_shader(load, userptr); + sf_glad_gl_load_GL_ARB_texture_barrier(load, userptr); + sf_glad_gl_load_GL_ARB_texture_buffer_range(load, userptr); + sf_glad_gl_load_GL_ARB_texture_multisample(load, userptr); + sf_glad_gl_load_GL_ARB_texture_storage(load, userptr); + sf_glad_gl_load_GL_ARB_texture_storage_multisample(load, userptr); + sf_glad_gl_load_GL_ARB_texture_view(load, userptr); + sf_glad_gl_load_GL_ARB_timer_query(load, userptr); + sf_glad_gl_load_GL_ARB_transform_feedback2(load, userptr); + sf_glad_gl_load_GL_ARB_transform_feedback3(load, userptr); + sf_glad_gl_load_GL_ARB_transform_feedback_instanced(load, userptr); + sf_glad_gl_load_GL_ARB_uniform_buffer_object(load, userptr); + sf_glad_gl_load_GL_ARB_vertex_array_object(load, userptr); + sf_glad_gl_load_GL_ARB_vertex_attrib_64bit(load, userptr); + sf_glad_gl_load_GL_ARB_vertex_attrib_binding(load, userptr); sf_glad_gl_load_GL_ARB_vertex_buffer_object(load, userptr); sf_glad_gl_load_GL_ARB_vertex_program(load, userptr); sf_glad_gl_load_GL_ARB_vertex_shader(load, userptr); + sf_glad_gl_load_GL_ARB_vertex_type_2_10_10_10_rev(load, userptr); + sf_glad_gl_load_GL_ARB_viewport_array(load, userptr); sf_glad_gl_load_GL_EXT_blend_equation_separate(load, userptr); sf_glad_gl_load_GL_EXT_blend_func_separate(load, userptr); sf_glad_gl_load_GL_EXT_blend_minmax(load, userptr); @@ -7735,6 +12139,7 @@ static int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) { sf_glad_gl_load_GL_EXT_vertex_array(load, userptr); sf_glad_gl_load_GL_INGR_blend_func_separate(load, userptr); sf_glad_gl_load_GL_KHR_debug(load, userptr); + sf_glad_gl_load_GL_KHR_robustness(load, userptr); sf_glad_gl_load_GL_NV_geometry_program4(load, userptr); sf_glad_gl_load_GL_NV_vertex_program(load, userptr); sf_glad_gl_load_GL_OES_single_precision(load, userptr); @@ -7758,6 +12163,7 @@ static int sf_glad_gl_find_extensions_gles1( int version) { SF_GLAD_GL_EXT_blend_minmax = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_blend_minmax"); SF_GLAD_GL_KHR_debug = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_KHR_debug"); + SF_GLAD_GL_OES_single_precision = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision"); SF_GLAD_GL_EXT_sRGB = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_sRGB"); SF_GLAD_GL_OES_blend_equation_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_equation_separate"); SF_GLAD_GL_OES_blend_func_separate = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_blend_func_separate"); @@ -7766,7 +12172,6 @@ static int sf_glad_gl_find_extensions_gles1( int version) { SF_GLAD_GL_OES_depth32 = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_depth32"); SF_GLAD_GL_OES_framebuffer_object = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_framebuffer_object"); SF_GLAD_GL_OES_packed_depth_stencil = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_packed_depth_stencil"); - SF_GLAD_GL_OES_single_precision = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_single_precision"); SF_GLAD_GL_OES_texture_npot = sf_glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_OES_texture_npot"); sf_glad_gl_free_extensions(exts_i, num_exts_i); @@ -7813,11 +12218,11 @@ static int gladLoadGLES1UserPtr( GLADuserptrloadfunc load, void *userptr) { if (!sf_glad_gl_find_extensions_gles1(version)) return 0; sf_glad_gl_load_GL_EXT_blend_minmax(load, userptr); sf_glad_gl_load_GL_KHR_debug(load, userptr); + sf_glad_gl_load_GL_OES_single_precision(load, userptr); sf_glad_gl_load_GL_OES_blend_equation_separate(load, userptr); sf_glad_gl_load_GL_OES_blend_func_separate(load, userptr); sf_glad_gl_load_GL_OES_blend_subtract(load, userptr); sf_glad_gl_load_GL_OES_framebuffer_object(load, userptr); - sf_glad_gl_load_GL_OES_single_precision(load, userptr); sf_glad_gl_resolve_aliases(); @@ -7835,5 +12240,9 @@ static int gladLoadGLES1( GLADloadfunc load) { +#ifdef __cplusplus +} +#endif + #endif /* SF_GLAD_GL_IMPLEMENTATION */ diff --git a/extern/sfml/extlibs/headers/stb_image/stb_image.h b/extern/sfml/extlibs/headers/stb_image/stb_image.h index a056138..baadbbf 100644 --- a/extern/sfml/extlibs/headers/stb_image/stb_image.h +++ b/extern/sfml/extlibs/headers/stb_image/stb_image.h @@ -1,7187 +1,7762 @@ -/* stb_image - v2.16 - public domain image loader - http://nothings.org/stb_image.h - no warranty implied; use at your own risk - - Do this: - #define STB_IMAGE_IMPLEMENTATION - before you include this file in *one* C or C++ file to create the implementation. - - // i.e. it should look like this: - #include ... - #include ... - #include ... - #define STB_IMAGE_IMPLEMENTATION - #include "stb_image.h" - - You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. - And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free - - - QUICK NOTES: - Primarily of interest to game developers and other people who can - avoid problematic images and only need the trivial interface - - 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 (*comp 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: - http://gist.github.com/urraka/685d9a6340b26b830d49 - - - decode from memory or through FILE (define STBI_NO_STDIO to remove code) - - decode from arbitrary I/O callbacks - - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) - - Full documentation under "DOCUMENTATION" below. - - -LICENSE - - See end of file for license information. - -RECENT REVISION HISTORY: - - 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes - 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 - RGB-format JPEG; remove white matting in PSD; - allocate large structures on the stack; - correct channel count for PNG & BMP - 2.10 (2016-01-22) avoid warning introduced in 2.09 - 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED - - See end of file for full revision history. - - - ============================ Contributors ========================= - - Image formats Extensions, features - Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) - Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) - Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) - Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) - Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) - Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) - Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) - github:urraka (animated gif) Junggon Kim (PNM comments) - Daniel Gibson (16-bit TGA) - socks-the-fox (16-bit PNG) - Jeremy Sawicki (handle all ImageNet JPGs) - Optimizations & bugfixes - Fabian "ryg" Giesen - Arseny Kapoulkine - John-Mark Allen - - Bug & warning fixes - Marc LeBlanc David Woo Guillaume George Martins Mozeiko - Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan - Dave Moore Roy Eltham Hayaki Saito Nathan Reed - Won Chun Luke Graham Johan Duparc Nick Verigakis - the Horde3D community Thomas Ruf Ronny Chevalier Baldur Karlsson - Janez Zemva John Bartholomew Michal Cichon github:rlyeh - Jonathan Blow Ken Hamada Tero Hanninen github:romigrou - Laurent Gomila Cort Stratton Sergio Gonzalez github:svdijk - Aruelien Pocheville Thibault Reuille Cass Everitt github:snagar - Ryamond Barbiero Paul Du Bois Engin Manap github:Zelex - Michaelangel007@github Philipp Wiesemann Dale Weiler github:grim210 - Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:sammyhw - Blazej Dariusz Roszkowski Gregory Mullen github:phprus - Christian Floisand Kevin Schmidt github:poppolopoppo -*/ - -#ifndef STBI_INCLUDE_STB_IMAGE_H -#define STBI_INCLUDE_STB_IMAGE_H - -// DOCUMENTATION -// -// Limitations: -// - no 16-bit-per-channel PNG -// - no 12-bit-per-channel JPEG -// - no JPEGs with arithmetic coding -// - no 1-bit BMP -// - GIF always returns *comp=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) -// -// Standard parameters: -// int *x -- outputs image width in pixels -// int *y -- outputs image height in pixels -// int *channels_in_file -- outputs # of image components in image file -// int desired_channels -- if non-zero, # of image components requested in result -// -// The return value from an image loader is an 'unsigned char *' which points -// to the pixel data, or NULL on an allocation failure or if the image is -// corrupt or invalid. The pixel data consists of *y scanlines of *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 'desired_channels' if desired_channels is non-zero, or -// *channels_in_file otherwise. If desired_channels is non-zero, -// *channels_in_file has the number of components that _would_ have been -// output otherwise. E.g. if you set desired_channels to 4, you will always -// get RGBA output, but you can check *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=#comp 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 NULL, -// and *x, *y, *channels_in_file will be unchanged. The function -// stbi_failure_reason() can be queried for an extremely brief, end-user -// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS -// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly -// more user-friendly ones. -// -// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. -// -// =========================================================================== -// -// Philosophy -// -// stb libraries are designed with the following priorities: -// -// 1. easy to use -// 2. easy to maintain -// 3. good performance -// -// Sometimes I let "good performance" creep up in priority over "easy to maintain", -// and for best performance I may provide less-easy-to-use APIs that give higher -// performance, in addition to the easy to use ones. Nevertheless, it's important -// to keep in mind that from the standpoint of you, a client of this library, -// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. -// -// Some secondary priorities arise directly from the first two, some of which -// make more explicit reasons why performance can't be emphasized. -// -// - Portable ("ease of use") -// - Small source code footprint ("easy to maintain") -// - No dependencies ("ease of use") -// -// =========================================================================== -// -// I/O callbacks -// -// 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). -// -// =========================================================================== -// -// SIMD support -// -// The JPEG decoder will try to automatically use SIMD kernels on x86 when -// supported by the compiler. For ARM Neon support, you must explicitly -// request it. -// -// (The old do-it-yourself SIMD API is no longer supported in the current -// code.) -// -// On x86, SSE2 will automatically be used when available based on a run-time -// test; if not, the generic C versions are used as a fall-back. On ARM targets, -// the typical path is to have separate builds for NEON and non-NEON devices -// (at least this is true for iOS and Android). Therefore, the NEON support is -// toggled by a build flag: define STBI_NEON to get NEON loops. -// -// If for some reason you do not want to use any of SIMD code, or if -// you have issues compiling it, you can disable it entirely by -// defining STBI_NO_SIMD. -// -// =========================================================================== -// -// HDR image support (disable by defining STBI_NO_HDR) -// -// stb_image now supports loading HDR images in general, and currently -// the Radiance .HDR file format, although the support is provided -// generically. 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--see header -// file for details) 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: -// -// By default we convert iphone-formatted PNGs back to RGB, even though -// they are internally encoded differently. You can disable this conversion -// by by calling stbi_convert_iphone_png_to_rgb(0), in which case -// you will always just get the native iphone "format" through (which -// is BGR stored in RGB). -// -// Call stbi_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). -// -// =========================================================================== -// -// ADDITIONAL CONFIGURATION -// -// - You can suppress implementation of any of the decoders to reduce -// your code footprint by #defining one or more of the following -// symbols before creating the implementation. -// -// STBI_NO_JPEG -// STBI_NO_PNG -// STBI_NO_BMP -// STBI_NO_PSD -// STBI_NO_TGA -// STBI_NO_GIF -// STBI_NO_HDR -// STBI_NO_PIC -// STBI_NO_PNM (.ppm and .pgm) -// -// - You can request *only* certain decoders and suppress all other ones -// (this will be more forward-compatible, as addition of new decoders -// doesn't require you to disable them explicitly): -// -// STBI_ONLY_JPEG -// STBI_ONLY_PNG -// STBI_ONLY_BMP -// STBI_ONLY_PSD -// STBI_ONLY_TGA -// STBI_ONLY_GIF -// STBI_ONLY_HDR -// STBI_ONLY_PIC -// STBI_ONLY_PNM (.ppm and .pgm) -// -// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still -// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB -// - - -#ifndef STBI_NO_STDIO -#include -#endif // STBI_NO_STDIO - -#define STBI_VERSION 1 - -enum -{ - STBI_default = 0, // only used for desired_channels - - STBI_grey = 1, - STBI_grey_alpha = 2, - STBI_rgb = 3, - STBI_rgb_alpha = 4 -}; - -typedef unsigned char stbi_uc; -typedef unsigned short stbi_us; - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef STB_IMAGE_STATIC -#define STBIDEF static -#else -#define STBIDEF extern -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// PRIMARY API - works on images of any type -// - -// -// load image by filename, open file, or memory buffer -// - -typedef struct -{ - int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read - void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative - int (*eof) (void *user); // returns nonzero if we are at end of file/data -} stbi_io_callbacks; - -//////////////////////////////////// -// -// 8-bits-per-channel interface -// - -STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -// for stbi_load_from_file, file pointer is left pointing immediately after image -#endif - -//////////////////////////////////// -// -// 16-bits-per-channel interface -// - -STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - -#ifndef STBI_NO_STDIO -STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); -STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); -#endif - -//////////////////////////////////// -// -// float-per-channel interface -// -#ifndef STBI_NO_LINEAR - STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); - - #ifndef STBI_NO_STDIO - STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); - STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); - #endif -#endif - -#ifndef STBI_NO_HDR - STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); - STBIDEF void stbi_hdr_to_ldr_scale(float scale); -#endif // STBI_NO_HDR - -#ifndef STBI_NO_LINEAR - STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); - STBIDEF void stbi_ldr_to_hdr_scale(float scale); -#endif // STBI_NO_LINEAR - -// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename); -STBIDEF int stbi_is_hdr_from_file(FILE *f); -#endif // STBI_NO_STDIO - - -// get a VERY brief reason for failure -// NOT THREADSAFE -STBIDEF const char *stbi_failure_reason (void); - -// free the loaded image -- this is just free() -STBIDEF void stbi_image_free (void *retval_from_stbi_load); - -// get image dimensions & components without fully decoding -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); -STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); - -#endif - - - -// 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 overflow. -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); - -// indicate whether we should process iphone images back to canonical format, -// or just pass them through "as-is" -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); - -// flip the image vertically, so the first pixel in the output array is the bottom left -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); - -// ZLIB client - used by PNG, available for other purposes - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); -STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - -STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); - - -#ifdef __cplusplus -} -#endif - -// -// -//// end header file ///////////////////////////////////////////////////// -#endif // STBI_INCLUDE_STB_IMAGE_H - -#ifdef STB_IMAGE_IMPLEMENTATION - -#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ - || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ - || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ - || defined(STBI_ONLY_ZLIB) - #ifndef STBI_ONLY_JPEG - #define STBI_NO_JPEG - #endif - #ifndef STBI_ONLY_PNG - #define STBI_NO_PNG - #endif - #ifndef STBI_ONLY_BMP - #define STBI_NO_BMP - #endif - #ifndef STBI_ONLY_PSD - #define STBI_NO_PSD - #endif - #ifndef STBI_ONLY_TGA - #define STBI_NO_TGA - #endif - #ifndef STBI_ONLY_GIF - #define STBI_NO_GIF - #endif - #ifndef STBI_ONLY_HDR - #define STBI_NO_HDR - #endif - #ifndef STBI_ONLY_PIC - #define STBI_NO_PIC - #endif - #ifndef STBI_ONLY_PNM - #define STBI_NO_PNM - #endif -#endif - -#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) -#define STBI_NO_ZLIB -#endif - - -#include -#include // ptrdiff_t on osx -#include -#include -#include - -#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) -#include // ldexp -#endif - -#ifndef STBI_NO_STDIO -#include -#endif - -#ifndef STBI_ASSERT -#include -#define STBI_ASSERT(x) assert(x) -#endif - - -#ifndef _MSC_VER - #ifdef __cplusplus - #define stbi_inline inline - #else - #define stbi_inline - #endif -#else - #define stbi_inline __forceinline -#endif - - -#ifdef _MSC_VER -typedef unsigned short stbi__uint16; -typedef signed short stbi__int16; -typedef unsigned int stbi__uint32; -typedef signed int stbi__int32; -#else -#include -typedef uint16_t stbi__uint16; -typedef int16_t stbi__int16; -typedef uint32_t stbi__uint32; -typedef int32_t stbi__int32; -#endif - -// should produce compiler error if size is wrong -typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; - -#ifdef _MSC_VER -#define STBI_NOTUSED(v) (void)(v) -#else -#define STBI_NOTUSED(v) (void)sizeof(v) -#endif - -#ifdef _MSC_VER -#define STBI_HAS_LROTL -#endif - -#ifdef STBI_HAS_LROTL - #define stbi_lrot(x,y) _lrotl(x,y) -#else - #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) -#endif - -#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) -// ok -#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." -#endif - -#ifndef STBI_MALLOC -#define STBI_MALLOC(sz) malloc(sz) -#define STBI_REALLOC(p,newsz) realloc(p,newsz) -#define STBI_FREE(p) free(p) -#endif - -#ifndef STBI_REALLOC_SIZED -#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) -#endif - -// x86/x64 detection -#if defined(__x86_64__) || defined(_M_X64) -#define STBI__X64_TARGET -#elif defined(__i386) || defined(_M_IX86) -#define STBI__X86_TARGET -#endif - -#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) -// gcc doesn't support sse2 intrinsics unless you compile with -msse2, -// which in turn means it gets to use SSE2 everywhere. This is unfortunate, -// but previous attempts to provide the SSE2 functions with runtime -// detection caused numerous issues. The way architecture extensions are -// exposed in GCC/Clang is, sadly, not really suited for one-file libs. -// New behavior: if compiled with -msse2, we use SSE2 without any -// detection; if not, we don't use it at all. -#define STBI_NO_SIMD -#endif - -#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) -// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET -// -// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the -// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. -// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not -// simultaneously enabling "-mstackrealign". -// -// See https://github.com/nothings/stb/issues/81 for more information. -// -// So default to no SSE2 on 32-bit MinGW. If you've read this far and added -// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. -#define STBI_NO_SIMD -#endif - -#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) -#define STBI_SSE2 -#include - -#ifdef _MSC_VER - -#if _MSC_VER >= 1400 // not VC6 -#include // __cpuid -static int stbi__cpuid3(void) -{ - int info[4]; - __cpuid(info,1); - return info[3]; -} -#else -static int stbi__cpuid3(void) -{ - int res; - __asm { - mov eax,1 - cpuid - mov res,edx - } - return res; -} -#endif - -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name - -static int stbi__sse2_available(void) -{ - int info3 = stbi__cpuid3(); - return ((info3 >> 26) & 1) != 0; -} -#else // assume GCC-style if not VC++ -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) - -static int stbi__sse2_available(void) -{ - // If we're even attempting to compile this on GCC/Clang, that means - // -msse2 is on, which means the compiler is allowed to use SSE2 - // instructions at will, and so are we. - return 1; -} -#endif -#endif - -// ARM NEON -#if defined(STBI_NO_SIMD) && defined(STBI_NEON) -#undef STBI_NEON -#endif - -#ifdef STBI_NEON -#include -// assume GCC or Clang on ARM targets -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif - -#ifndef STBI_SIMD_ALIGN -#define STBI_SIMD_ALIGN(type, name) type name -#endif - -/////////////////////////////////////////////// -// -// stbi__context struct and start_xxx functions - -// stbi__context structure is our basic context used by all images, so it -// contains all the IO context, plus some basic image information -typedef struct -{ - stbi__uint32 img_x, img_y; - int img_n, img_out_n; - - stbi_io_callbacks io; - void *io_user_data; - - int read_from_callbacks; - int buflen; - stbi_uc buffer_start[128]; - - stbi_uc *img_buffer, *img_buffer_end; - stbi_uc *img_buffer_original, *img_buffer_original_end; -} stbi__context; - - -static void stbi__refill_buffer(stbi__context *s); - -// initialize a memory-decode context -static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) -{ - s->io.read = NULL; - s->read_from_callbacks = 0; - s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; - s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; -} - -// initialize a callback-based context -static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) -{ - s->io = *c; - s->io_user_data = user; - s->buflen = sizeof(s->buffer_start); - s->read_from_callbacks = 1; - s->img_buffer_original = s->buffer_start; - stbi__refill_buffer(s); - s->img_buffer_original_end = s->img_buffer_end; -} - -#ifndef STBI_NO_STDIO - -static int stbi__stdio_read(void *user, char *data, int size) -{ - return (int) fread(data,1,size,(FILE*) user); -} - -static void stbi__stdio_skip(void *user, int n) -{ - fseek((FILE*) user, n, SEEK_CUR); -} - -static int stbi__stdio_eof(void *user) -{ - return feof((FILE*) user); -} - -static stbi_io_callbacks stbi__stdio_callbacks = -{ - stbi__stdio_read, - stbi__stdio_skip, - stbi__stdio_eof, -}; - -static void stbi__start_file(stbi__context *s, FILE *f) -{ - stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); -} - -//static void stop_file(stbi__context *s) { } - -#endif // !STBI_NO_STDIO - -static void stbi__rewind(stbi__context *s) -{ - // conceptually rewind SHOULD rewind to the beginning of the stream, - // but we just rewind to the beginning of the initial buffer, because - // we only use it after doing 'test', which only ever looks at at most 92 bytes - s->img_buffer = s->img_buffer_original; - s->img_buffer_end = s->img_buffer_original_end; -} - -enum -{ - STBI_ORDER_RGB, - STBI_ORDER_BGR -}; - -typedef struct -{ - int bits_per_channel; - int num_channels; - int channel_order; -} stbi__result_info; - -#ifndef STBI_NO_JPEG -static int stbi__jpeg_test(stbi__context *s); -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNG -static int stbi__png_test(stbi__context *s); -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_BMP -static int stbi__bmp_test(stbi__context *s); -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_TGA -static int stbi__tga_test(stbi__context *s); -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s); -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_HDR -static int stbi__hdr_test(stbi__context *s); -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_test(stbi__context *s); -static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_GIF -static int stbi__gif_test(stbi__context *s); -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -#ifndef STBI_NO_PNM -static int stbi__pnm_test(stbi__context *s); -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); -#endif - -// this is not threadsafe -static const char *stbi__g_failure_reason; - -STBIDEF const char *stbi_failure_reason(void) -{ - return stbi__g_failure_reason; -} - -static int stbi__err(const char *str) -{ - stbi__g_failure_reason = str; - return 0; -} - -static void *stbi__malloc(size_t size) -{ - return STBI_MALLOC(size); -} - -// stb_image uses ints pervasively, including for offset calculations. -// therefore the largest decoded image size we can support with the -// current code, even on 64-bit targets, is INT_MAX. this is not a -// significant limitation for the intended use case. -// -// we do, however, need to make sure our size calculations don't -// overflow. hence a few helper functions for size calculations that -// multiply integers together, making sure that they're non-negative -// and no overflow occurs. - -// return 1 if the sum is valid, 0 on overflow. -// negative terms are considered invalid. -static int stbi__addsizes_valid(int a, int b) -{ - if (b < 0) return 0; - // now 0 <= b <= INT_MAX, hence also - // 0 <= INT_MAX - b <= INTMAX. - // And "a + b <= INT_MAX" (which might overflow) is the - // same as a <= INT_MAX - b (no overflow) - return a <= INT_MAX - b; -} - -// returns 1 if the product is valid, 0 on overflow. -// negative factors are considered invalid. -static int stbi__mul2sizes_valid(int a, int b) -{ - if (a < 0 || b < 0) return 0; - if (b == 0) return 1; // mul-by-0 is always safe - // portable way to check for no overflows in a*b - return a <= INT_MAX/b; -} - -// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow -static int stbi__mad2sizes_valid(int a, int b, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); -} - -// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow -static int stbi__mad3sizes_valid(int a, int b, int c, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__addsizes_valid(a*b*c, add); -} - -// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow -static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) -{ - return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && - stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); -} - -// mallocs with size overflow checking -static void *stbi__malloc_mad2(int a, int b, int add) -{ - if (!stbi__mad2sizes_valid(a, b, add)) return NULL; - return stbi__malloc(a*b + add); -} - -static void *stbi__malloc_mad3(int a, int b, int c, int add) -{ - if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; - return stbi__malloc(a*b*c + add); -} - -static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) -{ - if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; - return stbi__malloc(a*b*c*d + add); -} - -// stbi__err - error -// stbi__errpf - error returning pointer to float -// stbi__errpuc - error returning pointer to unsigned char - -#ifdef STBI_NO_FAILURE_STRINGS - #define stbi__err(x,y) 0 -#elif defined(STBI_FAILURE_USERMSG) - #define stbi__err(x,y) stbi__err(y) -#else - #define stbi__err(x,y) stbi__err(x) -#endif - -#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) -#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) - -STBIDEF void stbi_image_free(void *retval_from_stbi_load) -{ - STBI_FREE(retval_from_stbi_load); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); -#endif - -#ifndef STBI_NO_HDR -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); -#endif - -static int stbi__vertically_flip_on_load = 0; - -STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) -{ - stbi__vertically_flip_on_load = flag_true_if_should_flip; -} - -static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields - ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed - ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order - ri->num_channels = 0; - - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNG - if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_BMP - if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_GIF - if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PSD - if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); - #endif - #ifndef STBI_NO_PIC - if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); - #endif - #ifndef STBI_NO_PNM - if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); - return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); - } - #endif - - #ifndef STBI_NO_TGA - // test tga last because it's a crappy test! - if (stbi__tga_test(s)) - return stbi__tga_load(s,x,y,comp,req_comp, ri); - #endif - - return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); -} - -static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi_uc *reduced; - - reduced = (stbi_uc *) stbi__malloc(img_len); - if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling - - STBI_FREE(orig); - return reduced; -} - -static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) -{ - int i; - int img_len = w * h * channels; - stbi__uint16 *enlarged; - - enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); - if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - - for (i = 0; i < img_len; ++i) - enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff - - STBI_FREE(orig); - return enlarged; -} - -static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) -{ - int row; - size_t bytes_per_row = (size_t)w * bytes_per_pixel; - stbi_uc temp[2048]; - stbi_uc *bytes = (stbi_uc *)image; - - for (row = 0; row < (h>>1); row++) { - stbi_uc *row0 = bytes + row*bytes_per_row; - stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; - // swap row0 with row1 - size_t bytes_left = bytes_per_row; - while (bytes_left) { - size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); - memcpy(temp, row0, bytes_copy); - memcpy(row0, row1, bytes_copy); - memcpy(row1, temp, bytes_copy); - row0 += bytes_copy; - row1 += bytes_copy; - bytes_left -= bytes_copy; - } - } -} - -static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); - - if (result == NULL) - return NULL; - - if (ri.bits_per_channel != 8) { - STBI_ASSERT(ri.bits_per_channel == 16); - result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 8; - } - - // @TODO: move stbi__convert_format to here - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); - } - - return (unsigned char *) result; -} - -static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - stbi__result_info ri; - void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); - - if (result == NULL) - return NULL; - - if (ri.bits_per_channel != 16) { - STBI_ASSERT(ri.bits_per_channel == 8); - result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); - ri.bits_per_channel = 16; - } - - // @TODO: move stbi__convert_format16 to here - // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision - - if (stbi__vertically_flip_on_load) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); - } - - return (stbi__uint16 *) result; -} - -#ifndef STBI_NO_HDR -static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) -{ - if (stbi__vertically_flip_on_load && result != NULL) { - int channels = req_comp ? req_comp : *comp; - stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); - } -} -#endif - -#ifndef STBI_NO_STDIO - -static FILE *stbi__fopen(char const *filename, char const *mode) -{ - FILE *f; -#if defined(_MSC_VER) && _MSC_VER >= 1400 - if (0 != fopen_s(&f, filename, mode)) - f=0; -#else - f = fopen(filename, mode); -#endif - return f; -} - - -STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - unsigned char *result; - if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__uint16 *result; - stbi__context s; - stbi__start_file(&s,f); - result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); - if (result) { - // need to 'unget' all the characters in the IO buffer - fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); - } - return result; -} - -STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - stbi__uint16 *result; - if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); - result = stbi_load_from_file_16(f,x,y,comp,req_comp); - fclose(f); - return result; -} - - -#endif //!STBI_NO_STDIO - -STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); - return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); -} - -STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_LINEAR -static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) -{ - unsigned char *data; - #ifndef STBI_NO_HDR - if (stbi__hdr_test(s)) { - stbi__result_info ri; - float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); - if (hdr_data) - stbi__float_postprocess(hdr_data,x,y,comp,req_comp); - return hdr_data; - } - #endif - data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); - if (data) - return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); - return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); -} - -STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} - -#ifndef STBI_NO_STDIO -STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) -{ - float *result; - FILE *f = stbi__fopen(filename, "rb"); - if (!f) return stbi__errpf("can't fopen", "Unable to open file"); - result = stbi_loadf_from_file(f,x,y,comp,req_comp); - fclose(f); - return result; -} - -STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) -{ - stbi__context s; - stbi__start_file(&s,f); - return stbi__loadf_main(&s,x,y,comp,req_comp); -} -#endif // !STBI_NO_STDIO - -#endif // !STBI_NO_LINEAR - -// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is -// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always -// reports false! - -STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(buffer); - STBI_NOTUSED(len); - return 0; - #endif -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_is_hdr (char const *filename) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result=0; - if (f) { - result = stbi_is_hdr_from_file(f); - fclose(f); - } - return result; -} - -STBIDEF int stbi_is_hdr_from_file(FILE *f) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_file(&s,f); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(f); - return 0; - #endif -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) -{ - #ifndef STBI_NO_HDR - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); - return stbi__hdr_test(&s); - #else - STBI_NOTUSED(clbk); - STBI_NOTUSED(user); - return 0; - #endif -} - -#ifndef STBI_NO_LINEAR -static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; - -STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } -STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } -#endif - -static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; - -STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } -STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } - - -////////////////////////////////////////////////////////////////////////////// -// -// Common code used by all image loaders -// - -enum -{ - STBI__SCAN_load=0, - STBI__SCAN_type, - STBI__SCAN_header -}; - -static void stbi__refill_buffer(stbi__context *s) -{ - int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); - if (n == 0) { - // at end of file, treat same as if from memory, but need to handle case - // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file - s->read_from_callbacks = 0; - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start+1; - *s->img_buffer = 0; - } else { - s->img_buffer = s->buffer_start; - s->img_buffer_end = s->buffer_start + n; - } -} - -stbi_inline static stbi_uc stbi__get8(stbi__context *s) -{ - if (s->img_buffer < s->img_buffer_end) - return *s->img_buffer++; - if (s->read_from_callbacks) { - stbi__refill_buffer(s); - return *s->img_buffer++; - } - return 0; -} - -stbi_inline static int stbi__at_eof(stbi__context *s) -{ - if (s->io.read) { - if (!(s->io.eof)(s->io_user_data)) return 0; - // if feof() is true, check if buffer = end - // special case: we've only got the special 0 character at the end - if (s->read_from_callbacks == 0) return 1; - } - - return s->img_buffer >= s->img_buffer_end; -} - -static void stbi__skip(stbi__context *s, int n) -{ - if (n < 0) { - s->img_buffer = s->img_buffer_end; - return; - } - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - s->img_buffer = s->img_buffer_end; - (s->io.skip)(s->io_user_data, n - blen); - return; - } - } - s->img_buffer += n; -} - -static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) -{ - if (s->io.read) { - int blen = (int) (s->img_buffer_end - s->img_buffer); - if (blen < n) { - int res, count; - - memcpy(buffer, s->img_buffer, blen); - - count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); - res = (count == (n-blen)); - s->img_buffer = s->img_buffer_end; - return res; - } - } - - if (s->img_buffer+n <= s->img_buffer_end) { - memcpy(buffer, s->img_buffer, n); - s->img_buffer += n; - return 1; - } else - return 0; -} - -static int stbi__get16be(stbi__context *s) -{ - int z = stbi__get8(s); - return (z << 8) + stbi__get8(s); -} - -static stbi__uint32 stbi__get32be(stbi__context *s) -{ - stbi__uint32 z = stbi__get16be(s); - return (z << 16) + stbi__get16be(s); -} - -#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) -// nothing -#else -static int stbi__get16le(stbi__context *s) -{ - int z = stbi__get8(s); - return z + (stbi__get8(s) << 8); -} -#endif - -#ifndef STBI_NO_BMP -static stbi__uint32 stbi__get32le(stbi__context *s) -{ - stbi__uint32 z = stbi__get16le(s); - return z + (stbi__get16le(s) << 16); -} -#endif - -#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings - - -////////////////////////////////////////////////////////////////////////////// -// -// generic converter from built-in img_n to req_comp -// individual types do this automatically as much as possible (e.g. jpeg -// does all cases internally since it needs to colorspace convert anyway, -// and it never has alpha, so very few cases ). png can automatically -// interleave an alpha=255 channel, but falls back to this for other cases -// -// assume data buffer is malloced, so malloc a new one and free that one -// only failure mode is malloc failing - -static stbi_uc stbi__compute_y(int r, int g, int b) -{ - return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - unsigned char *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); - if (good == NULL) { - STBI_FREE(data); - return stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - unsigned char *src = data + j * x * img_n ; - unsigned char *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; - default: STBI_ASSERT(0); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} - -static stbi__uint16 stbi__compute_y_16(int r, int g, int b) -{ - return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); -} - -static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) -{ - int i,j; - stbi__uint16 *good; - - if (req_comp == img_n) return data; - STBI_ASSERT(req_comp >= 1 && req_comp <= 4); - - good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); - if (good == NULL) { - STBI_FREE(data); - return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); - } - - for (j=0; j < (int) y; ++j) { - stbi__uint16 *src = data + j * x * img_n ; - stbi__uint16 *dest = good + j * x * req_comp; - - #define STBI__COMBO(a,b) ((a)*8+(b)) - #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) - // convert source image with img_n components to one with req_comp components; - // avoid switch per pixel, so use switch per scanline and massive macros - switch (STBI__COMBO(img_n, req_comp)) { - STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; } break; - STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; } break; - STBI__CASE(2,1) { dest[0]=src[0]; } break; - STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; - STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break; - STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; } break; - STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } break; - STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; - STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } break; - STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break; - default: STBI_ASSERT(0); - } - #undef STBI__CASE - } - - STBI_FREE(data); - return good; -} - -#ifndef STBI_NO_LINEAR -static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) -{ - int i,k,n; - float *output; - if (!data) return NULL; - output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); - } - if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; - } - STBI_FREE(data); - return output; -} -#endif - -#ifndef STBI_NO_HDR -#define stbi__float2int(x) ((int) (x)) -static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) -{ - int i,k,n; - stbi_uc *output; - if (!data) return NULL; - output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); - if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } - // compute number of non-alpha components - if (comp & 1) n = comp; else n = comp-1; - for (i=0; i < x*y; ++i) { - for (k=0; k < n; ++k) { - float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - if (k < comp) { - float z = data[i*comp+k] * 255 + 0.5f; - if (z < 0) z = 0; - if (z > 255) z = 255; - output[i*comp + k] = (stbi_uc) stbi__float2int(z); - } - } - STBI_FREE(data); - return output; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// "baseline" JPEG/JFIF decoder -// -// simple implementation -// - doesn't support delayed output of y-dimension -// - simple interface (only one output format: 8-bit interleaved RGB) -// - doesn't try to recover corrupt jpegs -// - doesn't allow partial loading, loading multiple at once -// - still fast on x86 (copying globals into locals doesn't help x86) -// - allocates lots of intermediate memory (full size of all components) -// - non-interleaved case requires this anyway -// - allows good upsampling (see next) -// high-quality -// - upsampled channels are bilinearly interpolated, even across blocks -// - quality integer IDCT derived from IJG's 'slow' -// performance -// - fast huffman; reasonable integer IDCT -// - some SIMD kernels for common paths on targets with SSE2/NEON -// - uses a lot of intermediate memory, could cache poorly - -#ifndef STBI_NO_JPEG - -// huffman decoding acceleration -#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache - -typedef struct -{ - stbi_uc fast[1 << FAST_BITS]; - // weirdly, repacking this into AoS is a 10% speed loss, instead of a win - stbi__uint16 code[256]; - stbi_uc values[256]; - stbi_uc size[257]; - unsigned int maxcode[18]; - int delta[17]; // old 'firstsymbol' - old 'firstcode' -} stbi__huffman; - -typedef struct -{ - stbi__context *s; - stbi__huffman huff_dc[4]; - stbi__huffman huff_ac[4]; - stbi__uint16 dequant[4][64]; - stbi__int16 fast_ac[4][1 << FAST_BITS]; - -// sizes for components, interleaved MCUs - int img_h_max, img_v_max; - int img_mcu_x, img_mcu_y; - int img_mcu_w, img_mcu_h; - -// definition of jpeg image component - struct - { - int id; - int h,v; - int tq; - int hd,ha; - int dc_pred; - - int x,y,w2,h2; - stbi_uc *data; - void *raw_data, *raw_coeff; - stbi_uc *linebuf; - short *coeff; // progressive only - int coeff_w, coeff_h; // number of 8x8 coefficient blocks - } img_comp[4]; - - stbi__uint32 code_buffer; // jpeg entropy-coded buffer - int code_bits; // number of valid bits - unsigned char marker; // marker seen while filling entropy buffer - int nomore; // flag if we saw a marker so must stop - - int progressive; - int spec_start; - int spec_end; - int succ_high; - int succ_low; - int eob_run; - int jfif; - int app14_color_transform; // Adobe APP14 tag - int rgb; - - int scan_n, order[4]; - int restart_interval, todo; - -// kernels - void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); - void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); - stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); -} stbi__jpeg; - -static int stbi__build_huffman(stbi__huffman *h, int *count) -{ - int i,j,k=0,code; - // build size list for each symbol (from JPEG spec) - for (i=0; i < 16; ++i) - for (j=0; j < count[i]; ++j) - h->size[k++] = (stbi_uc) (i+1); - h->size[k] = 0; - - // compute actual symbols (from jpeg spec) - code = 0; - k = 0; - for(j=1; j <= 16; ++j) { - // compute delta to add to code to compute symbol id - h->delta[j] = k - code; - if (h->size[k] == j) { - while (h->size[k] == j) - h->code[k++] = (stbi__uint16) (code++); - if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); - } - // compute largest code + 1 for this size, preshifted as needed later - h->maxcode[j] = code << (16-j); - code <<= 1; - } - h->maxcode[j] = 0xffffffff; - - // build non-spec acceleration table; 255 is flag for not-accelerated - memset(h->fast, 255, 1 << FAST_BITS); - for (i=0; i < k; ++i) { - int s = h->size[i]; - if (s <= FAST_BITS) { - int c = h->code[i] << (FAST_BITS-s); - int m = 1 << (FAST_BITS-s); - for (j=0; j < m; ++j) { - h->fast[c+j] = (stbi_uc) i; - } - } - } - return 1; -} - -// build a table that decodes both magnitude and value of small ACs in -// one go. -static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) -{ - int i; - for (i=0; i < (1 << FAST_BITS); ++i) { - stbi_uc fast = h->fast[i]; - fast_ac[i] = 0; - if (fast < 255) { - int rs = h->values[fast]; - int run = (rs >> 4) & 15; - int magbits = rs & 15; - int len = h->size[fast]; - - if (magbits && len + magbits <= FAST_BITS) { - // magnitude code followed by receive_extend code - int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); - int m = 1 << (magbits - 1); - if (k < m) k += (~0U << magbits) + 1; - // if the result is small enough, we can fit it in fast_ac table - if (k >= -128 && k <= 127) - fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); - } - } - } -} - -static void stbi__grow_buffer_unsafe(stbi__jpeg *j) -{ - do { - int b = j->nomore ? 0 : stbi__get8(j->s); - if (b == 0xff) { - int c = stbi__get8(j->s); - while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes - if (c != 0) { - j->marker = (unsigned char) c; - j->nomore = 1; - return; - } - } - j->code_buffer |= b << (24 - j->code_bits); - j->code_bits += 8; - } while (j->code_bits <= 24); -} - -// (1 << n) - 1 -static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; - -// decode a jpeg huffman value from the bitstream -stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) -{ - unsigned int temp; - int c,k; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - // look at the top FAST_BITS and determine what symbol ID it is, - // if the code is <= FAST_BITS - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - k = h->fast[c]; - if (k < 255) { - int s = h->size[k]; - if (s > j->code_bits) - return -1; - j->code_buffer <<= s; - j->code_bits -= s; - return h->values[k]; - } - - // naive test is to shift the code_buffer down so k bits are - // valid, then test against maxcode. To speed this up, we've - // preshifted maxcode left so that it has (16-k) 0s at the - // end; in other words, regardless of the number of bits, it - // wants to be compared against something shifted to have 16; - // that way we don't need to shift inside the loop. - temp = j->code_buffer >> 16; - for (k=FAST_BITS+1 ; ; ++k) - if (temp < h->maxcode[k]) - break; - if (k == 17) { - // error! code not found - j->code_bits -= 16; - return -1; - } - - if (k > j->code_bits) - return -1; - - // convert the huffman code to the symbol id - c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; - STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); - - // convert the id to a symbol - j->code_bits -= k; - j->code_buffer <<= k; - return h->values[c]; -} - -// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); - - sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB - k = stbi_lrot(j->code_buffer, n); - STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k + (stbi__jbias[n] & ~sgn); -} - -// get some unsigned bits -stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) -{ - unsigned int k; - if (j->code_bits < n) stbi__grow_buffer_unsafe(j); - k = stbi_lrot(j->code_buffer, n); - j->code_buffer = k & ~stbi__bmask[n]; - k &= stbi__bmask[n]; - j->code_bits -= n; - return k; -} - -stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) -{ - unsigned int k; - if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); - k = j->code_buffer; - j->code_buffer <<= 1; - --j->code_bits; - return k & 0x80000000; -} - -// given a value that's at position X in the zigzag stream, -// where does it appear in the 8x8 matrix coded as row-major? -static stbi_uc stbi__jpeg_dezigzag[64+15] = -{ - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - // let corrupt input sample past end - 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63 -}; - -// decode one 64-entry block-- -static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) -{ - int diff,dc,k; - int t; - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - t = stbi__jpeg_huff_decode(j, hdc); - if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - - // 0 all the ac values now so we can do it 32-bits at a time - memset(data,0,64*sizeof(data[0])); - - diff = t ? stbi__extend_receive(j, t) : 0; - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc * dequant[0]); - - // decode AC components, see JPEG spec - k = 1; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) * dequant[zig]); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (rs != 0xf0) break; // end block - k += 16; - } else { - k += r; - // decode into unzigzag'd location - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); - } - } - } while (k < 64); - return 1; -} - -static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) -{ - int diff,dc; - int t; - if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - - if (j->succ_high == 0) { - // first scan for DC coefficient, must be first - memset(data,0,64*sizeof(data[0])); // 0 all the ac values now - t = stbi__jpeg_huff_decode(j, hdc); - diff = t ? stbi__extend_receive(j, t) : 0; - - dc = j->img_comp[b].dc_pred + diff; - j->img_comp[b].dc_pred = dc; - data[0] = (short) (dc << j->succ_low); - } else { - // refinement scan for DC coefficient - if (stbi__jpeg_get_bit(j)) - data[0] += (short) (1 << j->succ_low); - } - return 1; -} - -// @OPTIMIZE: store non-zigzagged during the decode passes, -// and only de-zigzag when dequantizing -static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) -{ - int k; - if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); - - if (j->succ_high == 0) { - int shift = j->succ_low; - - if (j->eob_run) { - --j->eob_run; - return 1; - } - - k = j->spec_start; - do { - unsigned int zig; - int c,r,s; - if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); - c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); - r = fac[c]; - if (r) { // fast-AC path - k += (r >> 4) & 15; // run - s = r & 15; // combined length - j->code_buffer <<= s; - j->code_bits -= s; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) ((r >> 8) << shift); - } else { - int rs = stbi__jpeg_huff_decode(j, hac); - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r); - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - --j->eob_run; - break; - } - k += 16; - } else { - k += r; - zig = stbi__jpeg_dezigzag[k++]; - data[zig] = (short) (stbi__extend_receive(j,s) << shift); - } - } - } while (k <= j->spec_end); - } else { - // refinement scan for these AC coefficients - - short bit = (short) (1 << j->succ_low); - - if (j->eob_run) { - --j->eob_run; - for (k = j->spec_start; k <= j->spec_end; ++k) { - short *p = &data[stbi__jpeg_dezigzag[k]]; - if (*p != 0) - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } - } else { - k = j->spec_start; - do { - int r,s; - int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh - if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); - s = rs & 15; - r = rs >> 4; - if (s == 0) { - if (r < 15) { - j->eob_run = (1 << r) - 1; - if (r) - j->eob_run += stbi__jpeg_get_bits(j, r); - r = 64; // force end of block - } else { - // r=15 s=0 should write 16 0s, so we just do - // a run of 15 0s and then write s (which is 0), - // so we don't have to do anything special here - } - } else { - if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); - // sign bit - if (stbi__jpeg_get_bit(j)) - s = bit; - else - s = -bit; - } - - // advance by r - while (k <= j->spec_end) { - short *p = &data[stbi__jpeg_dezigzag[k++]]; - if (*p != 0) { - if (stbi__jpeg_get_bit(j)) - if ((*p & bit)==0) { - if (*p > 0) - *p += bit; - else - *p -= bit; - } - } else { - if (r == 0) { - *p = (short) s; - break; - } - --r; - } - } - } while (k <= j->spec_end); - } - } - return 1; -} - -// take a -128..127 value and stbi__clamp it and convert to 0..255 -stbi_inline static stbi_uc stbi__clamp(int x) -{ - // trick to use a single test to catch both cases - if ((unsigned int) x > 255) { - if (x < 0) return 0; - if (x > 255) return 255; - } - return (stbi_uc) x; -} - -#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) -#define stbi__fsh(x) ((x) << 12) - -// derived from jidctint -- DCT_ISLOW -#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ - int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ - p2 = s2; \ - p3 = s6; \ - p1 = (p2+p3) * stbi__f2f(0.5411961f); \ - t2 = p1 + p3*stbi__f2f(-1.847759065f); \ - t3 = p1 + p2*stbi__f2f( 0.765366865f); \ - p2 = s0; \ - p3 = s4; \ - t0 = stbi__fsh(p2+p3); \ - t1 = stbi__fsh(p2-p3); \ - x0 = t0+t3; \ - x3 = t0-t3; \ - x1 = t1+t2; \ - x2 = t1-t2; \ - t0 = s7; \ - t1 = s5; \ - t2 = s3; \ - t3 = s1; \ - p3 = t0+t2; \ - p4 = t1+t3; \ - p1 = t0+t3; \ - p2 = t1+t2; \ - p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ - t0 = t0*stbi__f2f( 0.298631336f); \ - t1 = t1*stbi__f2f( 2.053119869f); \ - t2 = t2*stbi__f2f( 3.072711026f); \ - t3 = t3*stbi__f2f( 1.501321110f); \ - p1 = p5 + p1*stbi__f2f(-0.899976223f); \ - p2 = p5 + p2*stbi__f2f(-2.562915447f); \ - p3 = p3*stbi__f2f(-1.961570560f); \ - p4 = p4*stbi__f2f(-0.390180644f); \ - t3 += p1+p4; \ - t2 += p2+p3; \ - t1 += p2+p4; \ - t0 += p1+p3; - -static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) -{ - int i,val[64],*v=val; - stbi_uc *o; - short *d = data; - - // columns - for (i=0; i < 8; ++i,++d, ++v) { - // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing - if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 - && d[40]==0 && d[48]==0 && d[56]==0) { - // no shortcut 0 seconds - // (1|2|3|4|5|6|7)==0 0 seconds - // all separate -0.047 seconds - // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds - int dcterm = d[0] << 2; - v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; - } else { - STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) - // constants scaled things up by 1<<12; let's bring them back - // down, but keep 2 extra bits of precision - x0 += 512; x1 += 512; x2 += 512; x3 += 512; - v[ 0] = (x0+t3) >> 10; - v[56] = (x0-t3) >> 10; - v[ 8] = (x1+t2) >> 10; - v[48] = (x1-t2) >> 10; - v[16] = (x2+t1) >> 10; - v[40] = (x2-t1) >> 10; - v[24] = (x3+t0) >> 10; - v[32] = (x3-t0) >> 10; - } - } - - for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { - // no fast case since the first 1D IDCT spread components out - STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) - // constants scaled things up by 1<<12, plus we had 1<<2 from first - // loop, plus horizontal and vertical each scale by sqrt(8) so together - // we've got an extra 1<<3, so 1<<17 total we need to remove. - // so we want to round that, which means adding 0.5 * 1<<17, - // aka 65536. Also, we'll end up with -128 to 127 that we want - // to encode as 0..255 by adding 128, so we'll add that before the shift - x0 += 65536 + (128<<17); - x1 += 65536 + (128<<17); - x2 += 65536 + (128<<17); - x3 += 65536 + (128<<17); - // tried computing the shifts into temps, or'ing the temps to see - // if any were out of range, but that was slower - o[0] = stbi__clamp((x0+t3) >> 17); - o[7] = stbi__clamp((x0-t3) >> 17); - o[1] = stbi__clamp((x1+t2) >> 17); - o[6] = stbi__clamp((x1-t2) >> 17); - o[2] = stbi__clamp((x2+t1) >> 17); - o[5] = stbi__clamp((x2-t1) >> 17); - o[3] = stbi__clamp((x3+t0) >> 17); - o[4] = stbi__clamp((x3-t0) >> 17); - } -} - -#ifdef STBI_SSE2 -// sse2 integer IDCT. not the fastest possible implementation but it -// produces bit-identical results to the generic C version so it's -// fully "transparent". -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - // This is constructed to match our regular (generic) integer IDCT exactly. - __m128i row0, row1, row2, row3, row4, row5, row6, row7; - __m128i tmp; - - // dot product constant: even elems=x, odd elems=y - #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) - - // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) - // out(1) = c1[even]*x + c1[odd]*y - #define dct_rot(out0,out1, x,y,c0,c1) \ - __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ - __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ - __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ - __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ - __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ - __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) - - // out = in << 12 (in 16-bit, out 32-bit) - #define dct_widen(out, in) \ - __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ - __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) - - // wide add - #define dct_wadd(out, a, b) \ - __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_add_epi32(a##_h, b##_h) - - // wide sub - #define dct_wsub(out, a, b) \ - __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ - __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) - - // butterfly a/b, add bias, then shift by "s" and pack - #define dct_bfly32o(out0, out1, a,b,bias,s) \ - { \ - __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ - __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ - dct_wadd(sum, abiased, b); \ - dct_wsub(dif, abiased, b); \ - out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ - out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ - } - - // 8-bit interleave step (for transposes) - #define dct_interleave8(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi8(a, b); \ - b = _mm_unpackhi_epi8(tmp, b) - - // 16-bit interleave step (for transposes) - #define dct_interleave16(a, b) \ - tmp = a; \ - a = _mm_unpacklo_epi16(a, b); \ - b = _mm_unpackhi_epi16(tmp, b) - - #define dct_pass(bias,shift) \ - { \ - /* even part */ \ - dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ - __m128i sum04 = _mm_add_epi16(row0, row4); \ - __m128i dif04 = _mm_sub_epi16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ - dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ - __m128i sum17 = _mm_add_epi16(row1, row7); \ - __m128i sum35 = _mm_add_epi16(row3, row5); \ - dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ - dct_wadd(x4, y0o, y4o); \ - dct_wadd(x5, y1o, y5o); \ - dct_wadd(x6, y2o, y5o); \ - dct_wadd(x7, y3o, y4o); \ - dct_bfly32o(row0,row7, x0,x7,bias,shift); \ - dct_bfly32o(row1,row6, x1,x6,bias,shift); \ - dct_bfly32o(row2,row5, x2,x5,bias,shift); \ - dct_bfly32o(row3,row4, x3,x4,bias,shift); \ - } - - __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); - __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); - __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); - __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); - __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); - __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); - __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); - __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); - - // rounding biases in column/row passes, see stbi__idct_block for explanation. - __m128i bias_0 = _mm_set1_epi32(512); - __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); - - // load - row0 = _mm_load_si128((const __m128i *) (data + 0*8)); - row1 = _mm_load_si128((const __m128i *) (data + 1*8)); - row2 = _mm_load_si128((const __m128i *) (data + 2*8)); - row3 = _mm_load_si128((const __m128i *) (data + 3*8)); - row4 = _mm_load_si128((const __m128i *) (data + 4*8)); - row5 = _mm_load_si128((const __m128i *) (data + 5*8)); - row6 = _mm_load_si128((const __m128i *) (data + 6*8)); - row7 = _mm_load_si128((const __m128i *) (data + 7*8)); - - // column pass - dct_pass(bias_0, 10); - - { - // 16bit 8x8 transpose pass 1 - dct_interleave16(row0, row4); - dct_interleave16(row1, row5); - dct_interleave16(row2, row6); - dct_interleave16(row3, row7); - - // transpose pass 2 - dct_interleave16(row0, row2); - dct_interleave16(row1, row3); - dct_interleave16(row4, row6); - dct_interleave16(row5, row7); - - // transpose pass 3 - dct_interleave16(row0, row1); - dct_interleave16(row2, row3); - dct_interleave16(row4, row5); - dct_interleave16(row6, row7); - } - - // row pass - dct_pass(bias_1, 17); - - { - // pack - __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 - __m128i p1 = _mm_packus_epi16(row2, row3); - __m128i p2 = _mm_packus_epi16(row4, row5); - __m128i p3 = _mm_packus_epi16(row6, row7); - - // 8bit 8x8 transpose pass 1 - dct_interleave8(p0, p2); // a0e0a1e1... - dct_interleave8(p1, p3); // c0g0c1g1... - - // transpose pass 2 - dct_interleave8(p0, p1); // a0c0e0g0... - dct_interleave8(p2, p3); // b0d0f0h0... - - // transpose pass 3 - dct_interleave8(p0, p2); // a0b0c0d0... - dct_interleave8(p1, p3); // a4b4c4d4... - - // store - _mm_storel_epi64((__m128i *) out, p0); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p2); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p1); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; - _mm_storel_epi64((__m128i *) out, p3); out += out_stride; - _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); - } - -#undef dct_const -#undef dct_rot -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_interleave8 -#undef dct_interleave16 -#undef dct_pass -} - -#endif // STBI_SSE2 - -#ifdef STBI_NEON - -// NEON integer IDCT. should produce bit-identical -// results to the generic C version. -static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) -{ - int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; - - int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); - int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); - int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); - int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); - int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); - int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); - int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); - int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); - int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); - int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); - int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); - int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); - -#define dct_long_mul(out, inq, coeff) \ - int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) - -#define dct_long_mac(out, acc, inq, coeff) \ - int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ - int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) - -#define dct_widen(out, inq) \ - int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ - int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) - -// wide add -#define dct_wadd(out, a, b) \ - int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vaddq_s32(a##_h, b##_h) - -// wide sub -#define dct_wsub(out, a, b) \ - int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ - int32x4_t out##_h = vsubq_s32(a##_h, b##_h) - -// butterfly a/b, then shift using "shiftop" by "s" and pack -#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ - { \ - dct_wadd(sum, a, b); \ - dct_wsub(dif, a, b); \ - out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ - out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ - } - -#define dct_pass(shiftop, shift) \ - { \ - /* even part */ \ - int16x8_t sum26 = vaddq_s16(row2, row6); \ - dct_long_mul(p1e, sum26, rot0_0); \ - dct_long_mac(t2e, p1e, row6, rot0_1); \ - dct_long_mac(t3e, p1e, row2, rot0_2); \ - int16x8_t sum04 = vaddq_s16(row0, row4); \ - int16x8_t dif04 = vsubq_s16(row0, row4); \ - dct_widen(t0e, sum04); \ - dct_widen(t1e, dif04); \ - dct_wadd(x0, t0e, t3e); \ - dct_wsub(x3, t0e, t3e); \ - dct_wadd(x1, t1e, t2e); \ - dct_wsub(x2, t1e, t2e); \ - /* odd part */ \ - int16x8_t sum15 = vaddq_s16(row1, row5); \ - int16x8_t sum17 = vaddq_s16(row1, row7); \ - int16x8_t sum35 = vaddq_s16(row3, row5); \ - int16x8_t sum37 = vaddq_s16(row3, row7); \ - int16x8_t sumodd = vaddq_s16(sum17, sum35); \ - dct_long_mul(p5o, sumodd, rot1_0); \ - dct_long_mac(p1o, p5o, sum17, rot1_1); \ - dct_long_mac(p2o, p5o, sum35, rot1_2); \ - dct_long_mul(p3o, sum37, rot2_0); \ - dct_long_mul(p4o, sum15, rot2_1); \ - dct_wadd(sump13o, p1o, p3o); \ - dct_wadd(sump24o, p2o, p4o); \ - dct_wadd(sump23o, p2o, p3o); \ - dct_wadd(sump14o, p1o, p4o); \ - dct_long_mac(x4, sump13o, row7, rot3_0); \ - dct_long_mac(x5, sump24o, row5, rot3_1); \ - dct_long_mac(x6, sump23o, row3, rot3_2); \ - dct_long_mac(x7, sump14o, row1, rot3_3); \ - dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ - dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ - dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ - dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ - } - - // load - row0 = vld1q_s16(data + 0*8); - row1 = vld1q_s16(data + 1*8); - row2 = vld1q_s16(data + 2*8); - row3 = vld1q_s16(data + 3*8); - row4 = vld1q_s16(data + 4*8); - row5 = vld1q_s16(data + 5*8); - row6 = vld1q_s16(data + 6*8); - row7 = vld1q_s16(data + 7*8); - - // add DC bias - row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); - - // column pass - dct_pass(vrshrn_n_s32, 10); - - // 16bit 8x8 transpose - { -// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. -// whether compilers actually get this is another story, sadly. -#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } -#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } - - // pass 1 - dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 - dct_trn16(row2, row3); - dct_trn16(row4, row5); - dct_trn16(row6, row7); - - // pass 2 - dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 - dct_trn32(row1, row3); - dct_trn32(row4, row6); - dct_trn32(row5, row7); - - // pass 3 - dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 - dct_trn64(row1, row5); - dct_trn64(row2, row6); - dct_trn64(row3, row7); - -#undef dct_trn16 -#undef dct_trn32 -#undef dct_trn64 - } - - // row pass - // vrshrn_n_s32 only supports shifts up to 16, we need - // 17. so do a non-rounding shift of 16 first then follow - // up with a rounding shift by 1. - dct_pass(vshrn_n_s32, 16); - - { - // pack and round - uint8x8_t p0 = vqrshrun_n_s16(row0, 1); - uint8x8_t p1 = vqrshrun_n_s16(row1, 1); - uint8x8_t p2 = vqrshrun_n_s16(row2, 1); - uint8x8_t p3 = vqrshrun_n_s16(row3, 1); - uint8x8_t p4 = vqrshrun_n_s16(row4, 1); - uint8x8_t p5 = vqrshrun_n_s16(row5, 1); - uint8x8_t p6 = vqrshrun_n_s16(row6, 1); - uint8x8_t p7 = vqrshrun_n_s16(row7, 1); - - // again, these can translate into one instruction, but often don't. -#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } -#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } -#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } - - // sadly can't use interleaved stores here since we only write - // 8 bytes to each scan line! - - // 8x8 8-bit transpose pass 1 - dct_trn8_8(p0, p1); - dct_trn8_8(p2, p3); - dct_trn8_8(p4, p5); - dct_trn8_8(p6, p7); - - // pass 2 - dct_trn8_16(p0, p2); - dct_trn8_16(p1, p3); - dct_trn8_16(p4, p6); - dct_trn8_16(p5, p7); - - // pass 3 - dct_trn8_32(p0, p4); - dct_trn8_32(p1, p5); - dct_trn8_32(p2, p6); - dct_trn8_32(p3, p7); - - // store - vst1_u8(out, p0); out += out_stride; - vst1_u8(out, p1); out += out_stride; - vst1_u8(out, p2); out += out_stride; - vst1_u8(out, p3); out += out_stride; - vst1_u8(out, p4); out += out_stride; - vst1_u8(out, p5); out += out_stride; - vst1_u8(out, p6); out += out_stride; - vst1_u8(out, p7); - -#undef dct_trn8_8 -#undef dct_trn8_16 -#undef dct_trn8_32 - } - -#undef dct_long_mul -#undef dct_long_mac -#undef dct_widen -#undef dct_wadd -#undef dct_wsub -#undef dct_bfly32o -#undef dct_pass -} - -#endif // STBI_NEON - -#define STBI__MARKER_none 0xff -// if there's a pending marker from the entropy stream, return that -// otherwise, fetch from the stream and get a marker. if there's no -// marker, return 0xff, which is never a valid marker value -static stbi_uc stbi__get_marker(stbi__jpeg *j) -{ - stbi_uc x; - if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } - x = stbi__get8(j->s); - if (x != 0xff) return STBI__MARKER_none; - while (x == 0xff) - x = stbi__get8(j->s); // consume repeated 0xff fill bytes - return x; -} - -// in each scan, we'll have scan_n components, and the order -// of the components is specified by order[] -#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) - -// after a restart interval, stbi__jpeg_reset the entropy decoder and -// the dc prediction -static void stbi__jpeg_reset(stbi__jpeg *j) -{ - j->code_bits = 0; - j->code_buffer = 0; - j->nomore = 0; - j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; - j->marker = STBI__MARKER_none; - j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; - j->eob_run = 0; - // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, - // since we don't even allow 1<<30 pixels -} - -static int stbi__parse_entropy_coded_data(stbi__jpeg *z) -{ - stbi__jpeg_reset(z); - if (!z->progressive) { - if (z->scan_n == 1) { - int i,j; - STBI_SIMD_ALIGN(short, data[64]); - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - // if it's NOT a restart, then just bail, so we get corrupt data - // rather than no data - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - STBI_SIMD_ALIGN(short, data[64]); - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x)*8; - int y2 = (j*z->img_comp[n].v + y)*8; - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } else { - if (z->scan_n == 1) { - int i,j; - int n = z->order[0]; - // non-interleaved data, we just need to process one block at a time, - // in trivial scanline order - // number of blocks to do just depends on how many actual "pixels" this - // component has, independent of interleaved MCU blocking and such - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - if (z->spec_start == 0) { - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } else { - int ha = z->img_comp[n].ha; - if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) - return 0; - } - // every data block is an MCU, so countdown the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } else { // interleaved - int i,j,k,x,y; - for (j=0; j < z->img_mcu_y; ++j) { - for (i=0; i < z->img_mcu_x; ++i) { - // scan an interleaved mcu... process scan_n components in order - for (k=0; k < z->scan_n; ++k) { - int n = z->order[k]; - // scan out an mcu's worth of this component; that's just determined - // by the basic H and V specified for the component - for (y=0; y < z->img_comp[n].v; ++y) { - for (x=0; x < z->img_comp[n].h; ++x) { - int x2 = (i*z->img_comp[n].h + x); - int y2 = (j*z->img_comp[n].v + y); - short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); - if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) - return 0; - } - } - } - // after all interleaved components, that's an interleaved MCU, - // so now count down the restart interval - if (--z->todo <= 0) { - if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); - if (!STBI__RESTART(z->marker)) return 1; - stbi__jpeg_reset(z); - } - } - } - return 1; - } - } -} - -static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) -{ - int i; - for (i=0; i < 64; ++i) - data[i] *= dequant[i]; -} - -static void stbi__jpeg_finish(stbi__jpeg *z) -{ - if (z->progressive) { - // dequantize and idct the data - int i,j,n; - for (n=0; n < z->s->img_n; ++n) { - int w = (z->img_comp[n].x+7) >> 3; - int h = (z->img_comp[n].y+7) >> 3; - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) { - short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); - stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); - z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); - } - } - } - } -} - -static int stbi__process_marker(stbi__jpeg *z, int m) -{ - int L; - switch (m) { - case STBI__MARKER_none: // no marker found - return stbi__err("expected marker","Corrupt JPEG"); - - case 0xDD: // DRI - specify restart interval - if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); - z->restart_interval = stbi__get16be(z->s); - return 1; - - case 0xDB: // DQT - define quantization table - L = stbi__get16be(z->s)-2; - while (L > 0) { - int q = stbi__get8(z->s); - int p = q >> 4, sixteen = (p != 0); - int t = q & 15,i; - if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); - if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); - - for (i=0; i < 64; ++i) - z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); - L -= (sixteen ? 129 : 65); - } - return L==0; - - case 0xC4: // DHT - define huffman table - L = stbi__get16be(z->s)-2; - while (L > 0) { - stbi_uc *v; - int sizes[16],i,n=0; - int q = stbi__get8(z->s); - int tc = q >> 4; - int th = q & 15; - if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); - for (i=0; i < 16; ++i) { - sizes[i] = stbi__get8(z->s); - n += sizes[i]; - } - L -= 17; - if (tc == 0) { - if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; - v = z->huff_dc[th].values; - } else { - if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; - v = z->huff_ac[th].values; - } - for (i=0; i < n; ++i) - v[i] = stbi__get8(z->s); - if (tc != 0) - stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); - L -= n; - } - return L==0; - } - - // check for comment block or APP blocks - if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { - L = stbi__get16be(z->s); - if (L < 2) { - if (m == 0xFE) - return stbi__err("bad COM len","Corrupt JPEG"); - else - return stbi__err("bad APP len","Corrupt JPEG"); - } - L -= 2; - - if (m == 0xE0 && L >= 5) { // JFIF APP0 segment - static const unsigned char tag[5] = {'J','F','I','F','\0'}; - int ok = 1; - int i; - for (i=0; i < 5; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 5; - if (ok) - z->jfif = 1; - } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment - static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; - int ok = 1; - int i; - for (i=0; i < 6; ++i) - if (stbi__get8(z->s) != tag[i]) - ok = 0; - L -= 6; - if (ok) { - stbi__get8(z->s); // version - stbi__get16be(z->s); // flags0 - stbi__get16be(z->s); // flags1 - z->app14_color_transform = stbi__get8(z->s); // color transform - L -= 6; - } - } - - stbi__skip(z->s, L); - return 1; - } - - return stbi__err("unknown marker","Corrupt JPEG"); -} - -// after we see SOS -static int stbi__process_scan_header(stbi__jpeg *z) -{ - int i; - int Ls = stbi__get16be(z->s); - z->scan_n = stbi__get8(z->s); - if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); - if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); - for (i=0; i < z->scan_n; ++i) { - int id = stbi__get8(z->s), which; - int q = stbi__get8(z->s); - for (which = 0; which < z->s->img_n; ++which) - if (z->img_comp[which].id == id) - break; - if (which == z->s->img_n) return 0; // no match - z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); - z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); - z->order[i] = which; - } - - { - int aa; - z->spec_start = stbi__get8(z->s); - z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 - aa = stbi__get8(z->s); - z->succ_high = (aa >> 4); - z->succ_low = (aa & 15); - if (z->progressive) { - if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) - return stbi__err("bad SOS", "Corrupt JPEG"); - } else { - if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); - if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); - z->spec_end = 63; - } - } - - return 1; -} - -static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) -{ - int i; - for (i=0; i < ncomp; ++i) { - if (z->img_comp[i].raw_data) { - STBI_FREE(z->img_comp[i].raw_data); - z->img_comp[i].raw_data = NULL; - z->img_comp[i].data = NULL; - } - if (z->img_comp[i].raw_coeff) { - STBI_FREE(z->img_comp[i].raw_coeff); - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].coeff = 0; - } - if (z->img_comp[i].linebuf) { - STBI_FREE(z->img_comp[i].linebuf); - z->img_comp[i].linebuf = NULL; - } - } - return why; -} - -static int stbi__process_frame_header(stbi__jpeg *z, int scan) -{ - stbi__context *s = z->s; - int Lf,p,i,q, h_max=1,v_max=1,c; - Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG - p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline - s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG - s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires - c = stbi__get8(s); - if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); - s->img_n = c; - for (i=0; i < c; ++i) { - z->img_comp[i].data = NULL; - z->img_comp[i].linebuf = NULL; - } - - if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); - - z->rgb = 0; - for (i=0; i < s->img_n; ++i) { - static unsigned char rgb[3] = { 'R', 'G', 'B' }; - z->img_comp[i].id = stbi__get8(s); - if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) - ++z->rgb; - q = stbi__get8(s); - z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); - z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); - z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); - } - - if (scan != STBI__SCAN_load) return 1; - - if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); - - for (i=0; i < s->img_n; ++i) { - if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; - if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; - } - - // compute interleaved mcu info - z->img_h_max = h_max; - z->img_v_max = v_max; - z->img_mcu_w = h_max * 8; - z->img_mcu_h = v_max * 8; - // these sizes can't be more than 17 bits - z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; - z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; - - for (i=0; i < s->img_n; ++i) { - // number of effective pixels (e.g. for non-interleaved MCU) - z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; - z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; - // to simplify generation, we'll allocate enough memory to decode - // the bogus oversized data from using interleaved MCUs and their - // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't - // discard the extra data until colorspace conversion - // - // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) - // so these muls can't overflow with 32-bit ints (which we require) - z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; - z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; - z->img_comp[i].coeff = 0; - z->img_comp[i].raw_coeff = 0; - z->img_comp[i].linebuf = NULL; - z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); - if (z->img_comp[i].raw_data == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - // align blocks for idct using mmx/sse - z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); - if (z->progressive) { - // w2, h2 are multiples of 8 (see above) - z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; - z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; - z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); - if (z->img_comp[i].raw_coeff == NULL) - return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); - z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); - } - } - - return 1; -} - -// use comparisons since in some cases we handle more than one case (e.g. SOF) -#define stbi__DNL(x) ((x) == 0xdc) -#define stbi__SOI(x) ((x) == 0xd8) -#define stbi__EOI(x) ((x) == 0xd9) -#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) -#define stbi__SOS(x) ((x) == 0xda) - -#define stbi__SOF_progressive(x) ((x) == 0xc2) - -static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) -{ - int m; - z->jfif = 0; - z->app14_color_transform = -1; // valid values are 0,1,2 - z->marker = STBI__MARKER_none; // initialize cached marker to empty - m = stbi__get_marker(z); - if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); - if (scan == STBI__SCAN_type) return 1; - m = stbi__get_marker(z); - while (!stbi__SOF(m)) { - if (!stbi__process_marker(z,m)) return 0; - m = stbi__get_marker(z); - while (m == STBI__MARKER_none) { - // some files have extra padding after their blocks, so ok, we'll scan - if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); - m = stbi__get_marker(z); - } - } - z->progressive = stbi__SOF_progressive(m); - if (!stbi__process_frame_header(z, scan)) return 0; - return 1; -} - -// decode image to YCbCr format -static int stbi__decode_jpeg_image(stbi__jpeg *j) -{ - int m; - for (m = 0; m < 4; m++) { - j->img_comp[m].raw_data = NULL; - j->img_comp[m].raw_coeff = NULL; - } - j->restart_interval = 0; - if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; - m = stbi__get_marker(j); - while (!stbi__EOI(m)) { - if (stbi__SOS(m)) { - if (!stbi__process_scan_header(j)) return 0; - if (!stbi__parse_entropy_coded_data(j)) return 0; - if (j->marker == STBI__MARKER_none ) { - // handle 0s at the end of image data from IP Kamera 9060 - while (!stbi__at_eof(j->s)) { - int x = stbi__get8(j->s); - if (x == 255) { - j->marker = stbi__get8(j->s); - break; - } - } - // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 - } - } else if (stbi__DNL(m)) { - int Ld = stbi__get16be(j->s); - stbi__uint32 NL = stbi__get16be(j->s); - if (Ld != 4) stbi__err("bad DNL len", "Corrupt JPEG"); - if (NL != j->s->img_y) stbi__err("bad DNL height", "Corrupt JPEG"); - } else { - if (!stbi__process_marker(j, m)) return 0; - } - m = stbi__get_marker(j); - } - if (j->progressive) - stbi__jpeg_finish(j); - return 1; -} - -// static jfif-centered resampling (across block boundaries) - -typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, - int w, int hs); - -#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) - -static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - STBI_NOTUSED(out); - STBI_NOTUSED(in_far); - STBI_NOTUSED(w); - STBI_NOTUSED(hs); - return in_near; -} - -static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples vertically for every one in input - int i; - STBI_NOTUSED(hs); - for (i=0; i < w; ++i) - out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); - return out; -} - -static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate two samples horizontally for every one in input - int i; - stbi_uc *input = in_near; - - if (w == 1) { - // if only one sample, can't do any interpolation - out[0] = out[1] = input[0]; - return out; - } - - out[0] = input[0]; - out[1] = stbi__div4(input[0]*3 + input[1] + 2); - for (i=1; i < w-1; ++i) { - int n = 3*input[i]+2; - out[i*2+0] = stbi__div4(n+input[i-1]); - out[i*2+1] = stbi__div4(n+input[i+1]); - } - out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); - out[i*2+1] = input[w-1]; - - STBI_NOTUSED(in_far); - STBI_NOTUSED(hs); - - return out; -} - -#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) - -static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i,t0,t1; - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - out[0] = stbi__div4(t1+2); - for (i=1; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // need to generate 2x2 samples for every one in input - int i=0,t0,t1; - - if (w == 1) { - out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); - return out; - } - - t1 = 3*in_near[0] + in_far[0]; - // process groups of 8 pixels for as long as we can. - // note we can't handle the last pixel in a row in this loop - // because we need to handle the filter boundary conditions. - for (; i < ((w-1) & ~7); i += 8) { -#if defined(STBI_SSE2) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - __m128i zero = _mm_setzero_si128(); - __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); - __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); - __m128i farw = _mm_unpacklo_epi8(farb, zero); - __m128i nearw = _mm_unpacklo_epi8(nearb, zero); - __m128i diff = _mm_sub_epi16(farw, nearw); - __m128i nears = _mm_slli_epi16(nearw, 2); - __m128i curr = _mm_add_epi16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - __m128i prv0 = _mm_slli_si128(curr, 2); - __m128i nxt0 = _mm_srli_si128(curr, 2); - __m128i prev = _mm_insert_epi16(prv0, t1, 0); - __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - __m128i bias = _mm_set1_epi16(8); - __m128i curs = _mm_slli_epi16(curr, 2); - __m128i prvd = _mm_sub_epi16(prev, curr); - __m128i nxtd = _mm_sub_epi16(next, curr); - __m128i curb = _mm_add_epi16(curs, bias); - __m128i even = _mm_add_epi16(prvd, curb); - __m128i odd = _mm_add_epi16(nxtd, curb); - - // interleave even and odd pixels, then undo scaling. - __m128i int0 = _mm_unpacklo_epi16(even, odd); - __m128i int1 = _mm_unpackhi_epi16(even, odd); - __m128i de0 = _mm_srli_epi16(int0, 4); - __m128i de1 = _mm_srli_epi16(int1, 4); - - // pack and write output - __m128i outv = _mm_packus_epi16(de0, de1); - _mm_storeu_si128((__m128i *) (out + i*2), outv); -#elif defined(STBI_NEON) - // load and perform the vertical filtering pass - // this uses 3*x + y = 4*x + (y - x) - uint8x8_t farb = vld1_u8(in_far + i); - uint8x8_t nearb = vld1_u8(in_near + i); - int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); - int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); - int16x8_t curr = vaddq_s16(nears, diff); // current row - - // horizontal filter works the same based on shifted vers of current - // row. "prev" is current row shifted right by 1 pixel; we need to - // insert the previous pixel value (from t1). - // "next" is current row shifted left by 1 pixel, with first pixel - // of next block of 8 pixels added in. - int16x8_t prv0 = vextq_s16(curr, curr, 7); - int16x8_t nxt0 = vextq_s16(curr, curr, 1); - int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); - int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); - - // horizontal filter, polyphase implementation since it's convenient: - // even pixels = 3*cur + prev = cur*4 + (prev - cur) - // odd pixels = 3*cur + next = cur*4 + (next - cur) - // note the shared term. - int16x8_t curs = vshlq_n_s16(curr, 2); - int16x8_t prvd = vsubq_s16(prev, curr); - int16x8_t nxtd = vsubq_s16(next, curr); - int16x8_t even = vaddq_s16(curs, prvd); - int16x8_t odd = vaddq_s16(curs, nxtd); - - // undo scaling and round, then store with even/odd phases interleaved - uint8x8x2_t o; - o.val[0] = vqrshrun_n_s16(even, 4); - o.val[1] = vqrshrun_n_s16(odd, 4); - vst2_u8(out + i*2, o); -#endif - - // "previous" value for next iter - t1 = 3*in_near[i+7] + in_far[i+7]; - } - - t0 = t1; - t1 = 3*in_near[i] + in_far[i]; - out[i*2] = stbi__div16(3*t1 + t0 + 8); - - for (++i; i < w; ++i) { - t0 = t1; - t1 = 3*in_near[i]+in_far[i]; - out[i*2-1] = stbi__div16(3*t0 + t1 + 8); - out[i*2 ] = stbi__div16(3*t1 + t0 + 8); - } - out[w*2-1] = stbi__div4(t1+2); - - STBI_NOTUSED(hs); - - return out; -} -#endif - -static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) -{ - // resample with nearest-neighbor - int i,j; - STBI_NOTUSED(in_far); - for (i=0; i < w; ++i) - for (j=0; j < hs; ++j) - out[i*hs+j] = in_near[i]; - return out; -} - -// this is a reduced-precision calculation of YCbCr-to-RGB introduced -// to make sure the code produces the same results in both SIMD and scalar -#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) -static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) -{ - int i; - for (i=0; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} - -#if defined(STBI_SSE2) || defined(STBI_NEON) -static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) -{ - int i = 0; - -#ifdef STBI_SSE2 - // step == 3 is pretty ugly on the final interleave, and i'm not convinced - // it's useful in practice (you wouldn't use it for textures, for example). - // so just accelerate step == 4 case. - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - __m128i signflip = _mm_set1_epi8(-0x80); - __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); - __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); - __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); - __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); - __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); - __m128i xw = _mm_set1_epi16(255); // alpha channel - - for (; i+7 < count; i += 8) { - // load - __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); - __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); - __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); - __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 - __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 - - // unpack to short (and left-shift cr, cb by 8) - __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); - __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); - __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); - - // color transform - __m128i yws = _mm_srli_epi16(yw, 4); - __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); - __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); - __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); - __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); - __m128i rws = _mm_add_epi16(cr0, yws); - __m128i gwt = _mm_add_epi16(cb0, yws); - __m128i bws = _mm_add_epi16(yws, cb1); - __m128i gws = _mm_add_epi16(gwt, cr1); - - // descale - __m128i rw = _mm_srai_epi16(rws, 4); - __m128i bw = _mm_srai_epi16(bws, 4); - __m128i gw = _mm_srai_epi16(gws, 4); - - // back to byte, set up for transpose - __m128i brb = _mm_packus_epi16(rw, bw); - __m128i gxb = _mm_packus_epi16(gw, xw); - - // transpose to interleave channels - __m128i t0 = _mm_unpacklo_epi8(brb, gxb); - __m128i t1 = _mm_unpackhi_epi8(brb, gxb); - __m128i o0 = _mm_unpacklo_epi16(t0, t1); - __m128i o1 = _mm_unpackhi_epi16(t0, t1); - - // store - _mm_storeu_si128((__m128i *) (out + 0), o0); - _mm_storeu_si128((__m128i *) (out + 16), o1); - out += 32; - } - } -#endif - -#ifdef STBI_NEON - // in this version, step=3 support would be easy to add. but is there demand? - if (step == 4) { - // this is a fairly straightforward implementation and not super-optimized. - uint8x8_t signflip = vdup_n_u8(0x80); - int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); - int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); - int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); - int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); - - for (; i+7 < count; i += 8) { - // load - uint8x8_t y_bytes = vld1_u8(y + i); - uint8x8_t cr_bytes = vld1_u8(pcr + i); - uint8x8_t cb_bytes = vld1_u8(pcb + i); - int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); - int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); - - // expand to s16 - int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); - int16x8_t crw = vshll_n_s8(cr_biased, 7); - int16x8_t cbw = vshll_n_s8(cb_biased, 7); - - // color transform - int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); - int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); - int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); - int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); - int16x8_t rws = vaddq_s16(yws, cr0); - int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); - int16x8_t bws = vaddq_s16(yws, cb1); - - // undo scaling, round, convert to byte - uint8x8x4_t o; - o.val[0] = vqrshrun_n_s16(rws, 4); - o.val[1] = vqrshrun_n_s16(gws, 4); - o.val[2] = vqrshrun_n_s16(bws, 4); - o.val[3] = vdup_n_u8(255); - - // store, interleaving r/g/b/a - vst4_u8(out, o); - out += 8*4; - } - } -#endif - - for (; i < count; ++i) { - int y_fixed = (y[i] << 20) + (1<<19); // rounding - int r,g,b; - int cr = pcr[i] - 128; - int cb = pcb[i] - 128; - r = y_fixed + cr* stbi__float2fixed(1.40200f); - g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); - b = y_fixed + cb* stbi__float2fixed(1.77200f); - r >>= 20; - g >>= 20; - b >>= 20; - if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } - if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } - if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } - out[0] = (stbi_uc)r; - out[1] = (stbi_uc)g; - out[2] = (stbi_uc)b; - out[3] = 255; - out += step; - } -} -#endif - -// set up the kernels -static void stbi__setup_jpeg(stbi__jpeg *j) -{ - j->idct_block_kernel = stbi__idct_block; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; - -#ifdef STBI_SSE2 - if (stbi__sse2_available()) { - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; - } -#endif - -#ifdef STBI_NEON - j->idct_block_kernel = stbi__idct_simd; - j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; - j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; -#endif -} - -// clean up the temporary component buffers -static void stbi__cleanup_jpeg(stbi__jpeg *j) -{ - stbi__free_jpeg_components(j, j->s->img_n, 0); -} - -typedef struct -{ - resample_row_func resample; - stbi_uc *line0,*line1; - int hs,vs; // expansion factor in each axis - int w_lores; // horizontal pixels pre-expansion - int ystep; // how far through vertical expansion we are - int ypos; // which pre-expansion row we're on -} stbi__resample; - -// fast 0..255 * 0..255 => 0..255 rounded multiplication -static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) -{ - unsigned int t = x*y + 128; - return (stbi_uc) ((t + (t >>8)) >> 8); -} - -static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) -{ - int n, decode_n, is_rgb; - z->s->img_n = 0; // make stbi__cleanup_jpeg safe - - // validate req_comp - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - - // load a jpeg image from whichever source, but leave in YCbCr format - if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } - - // determine actual number of components to generate - n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; - - is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); - - if (z->s->img_n == 3 && n < 3 && !is_rgb) - decode_n = 1; - else - decode_n = z->s->img_n; - - // resample and color-convert - { - int k; - unsigned int i,j; - stbi_uc *output; - stbi_uc *coutput[4]; - - stbi__resample res_comp[4]; - - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - - // allocate line buffer big enough for upsampling off the edges - // with upsample factor of 4 - z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); - if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - r->hs = z->img_h_max / z->img_comp[k].h; - r->vs = z->img_v_max / z->img_comp[k].v; - r->ystep = r->vs >> 1; - r->w_lores = (z->s->img_x + r->hs-1) / r->hs; - r->ypos = 0; - r->line0 = r->line1 = z->img_comp[k].data; - - if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; - else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; - else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; - else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; - else r->resample = stbi__resample_row_generic; - } - - // can't error after this so, this is safe - output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); - if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } - - // now go ahead and resample - for (j=0; j < z->s->img_y; ++j) { - stbi_uc *out = output + n * z->s->img_x * j; - for (k=0; k < decode_n; ++k) { - stbi__resample *r = &res_comp[k]; - int y_bot = r->ystep >= (r->vs >> 1); - coutput[k] = r->resample(z->img_comp[k].linebuf, - y_bot ? r->line1 : r->line0, - y_bot ? r->line0 : r->line1, - r->w_lores, r->hs); - if (++r->ystep >= r->vs) { - r->ystep = 0; - r->line0 = r->line1; - if (++r->ypos < z->img_comp[k].y) - r->line1 += z->img_comp[k].w2; - } - } - if (n >= 3) { - stbi_uc *y = coutput[0]; - if (z->s->img_n == 3) { - if (is_rgb) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = y[i]; - out[1] = coutput[1][i]; - out[2] = coutput[2][i]; - out[3] = 255; - out += n; - } - } else { - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else if (z->s->img_n == 4) { - if (z->app14_color_transform == 0) { // CMYK - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(coutput[0][i], m); - out[1] = stbi__blinn_8x8(coutput[1][i], m); - out[2] = stbi__blinn_8x8(coutput[2][i], m); - out[3] = 255; - out += n; - } - } else if (z->app14_color_transform == 2) { // YCCK - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - out[0] = stbi__blinn_8x8(255 - out[0], m); - out[1] = stbi__blinn_8x8(255 - out[1], m); - out[2] = stbi__blinn_8x8(255 - out[2], m); - out += n; - } - } else { // YCbCr + alpha? Ignore the fourth channel for now - z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); - } - } else - for (i=0; i < z->s->img_x; ++i) { - out[0] = out[1] = out[2] = y[i]; - out[3] = 255; // not used if n==3 - out += n; - } - } else { - if (is_rgb) { - if (n == 1) - for (i=0; i < z->s->img_x; ++i) - *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - else { - for (i=0; i < z->s->img_x; ++i, out += 2) { - out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); - out[1] = 255; - } - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { - for (i=0; i < z->s->img_x; ++i) { - stbi_uc m = coutput[3][i]; - stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); - stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); - stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); - out[0] = stbi__compute_y(r, g, b); - out[1] = 255; - out += n; - } - } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { - for (i=0; i < z->s->img_x; ++i) { - out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); - out[1] = 255; - out += n; - } - } else { - stbi_uc *y = coutput[0]; - if (n == 1) - for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; - else - for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; - } - } - } - stbi__cleanup_jpeg(z); - *out_x = z->s->img_x; - *out_y = z->s->img_y; - if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output - return output; - } -} - -static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - unsigned char* result; - stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); - STBI_NOTUSED(ri); - j->s = s; - stbi__setup_jpeg(j); - result = load_jpeg_image(j, x,y,comp,req_comp); - STBI_FREE(j); - return result; -} - -static int stbi__jpeg_test(stbi__context *s) -{ - int r; - stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); - j->s = s; - stbi__setup_jpeg(j); - r = stbi__decode_jpeg_header(j, STBI__SCAN_type); - stbi__rewind(s); - STBI_FREE(j); - return r; -} - -static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) -{ - if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { - stbi__rewind( j->s ); - return 0; - } - if (x) *x = j->s->img_x; - if (y) *y = j->s->img_y; - if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; - return 1; -} - -static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) -{ - int result; - stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); - j->s = s; - result = stbi__jpeg_info_raw(j, x, y, comp); - STBI_FREE(j); - return result; -} -#endif - -// public domain zlib decode v0.2 Sean Barrett 2006-11-18 -// simple implementation -// - all input must be provided in an upfront buffer -// - all output is written to a single output buffer (can malloc/realloc) -// performance -// - fast huffman - -#ifndef STBI_NO_ZLIB - -// fast-way is faster to check than jpeg huffman, but slow way is slower -#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables -#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) - -// zlib-style huffman encoding -// (jpegs packs from left, zlib from right, so can't share code) -typedef struct -{ - stbi__uint16 fast[1 << STBI__ZFAST_BITS]; - stbi__uint16 firstcode[16]; - int maxcode[17]; - stbi__uint16 firstsymbol[16]; - stbi_uc size[288]; - stbi__uint16 value[288]; -} stbi__zhuffman; - -stbi_inline static int stbi__bitreverse16(int n) -{ - n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); - n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); - n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); - n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); - return n; -} - -stbi_inline static int stbi__bit_reverse(int v, int bits) -{ - STBI_ASSERT(bits <= 16); - // to bit reverse n bits, reverse 16 and shift - // e.g. 11 bits, bit reverse and shift away 5 - return stbi__bitreverse16(v) >> (16-bits); -} - -static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) -{ - int i,k=0; - int code, next_code[16], sizes[17]; - - // DEFLATE spec for generating codes - memset(sizes, 0, sizeof(sizes)); - memset(z->fast, 0, sizeof(z->fast)); - for (i=0; i < num; ++i) - ++sizes[sizelist[i]]; - sizes[0] = 0; - for (i=1; i < 16; ++i) - if (sizes[i] > (1 << i)) - return stbi__err("bad sizes", "Corrupt PNG"); - code = 0; - for (i=1; i < 16; ++i) { - next_code[i] = code; - z->firstcode[i] = (stbi__uint16) code; - z->firstsymbol[i] = (stbi__uint16) k; - code = (code + sizes[i]); - if (sizes[i]) - if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); - z->maxcode[i] = code << (16-i); // preshift for inner loop - code <<= 1; - k += sizes[i]; - } - z->maxcode[16] = 0x10000; // sentinel - for (i=0; i < num; ++i) { - int s = sizelist[i]; - if (s) { - int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; - stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); - z->size [c] = (stbi_uc ) s; - z->value[c] = (stbi__uint16) i; - if (s <= STBI__ZFAST_BITS) { - int j = stbi__bit_reverse(next_code[s],s); - while (j < (1 << STBI__ZFAST_BITS)) { - z->fast[j] = fastv; - j += (1 << s); - } - } - ++next_code[s]; - } - } - return 1; -} - -// zlib-from-memory implementation for PNG reading -// because PNG allows splitting the zlib stream arbitrarily, -// and it's annoying structurally to have PNG call ZLIB call PNG, -// we require PNG read all the IDATs and combine them into a single -// memory buffer - -typedef struct -{ - stbi_uc *zbuffer, *zbuffer_end; - int num_bits; - stbi__uint32 code_buffer; - - char *zout; - char *zout_start; - char *zout_end; - int z_expandable; - - stbi__zhuffman z_length, z_distance; -} stbi__zbuf; - -stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) -{ - if (z->zbuffer >= z->zbuffer_end) return 0; - return *z->zbuffer++; -} - -static void stbi__fill_bits(stbi__zbuf *z) -{ - do { - STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); - z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; - z->num_bits += 8; - } while (z->num_bits <= 24); -} - -stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) -{ - unsigned int k; - if (z->num_bits < n) stbi__fill_bits(z); - k = z->code_buffer & ((1 << n) - 1); - z->code_buffer >>= n; - z->num_bits -= n; - return k; -} - -static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s,k; - // not resolved by fast table, so compute it the slow way - // use jpeg approach, which requires MSbits at top - k = stbi__bit_reverse(a->code_buffer, 16); - for (s=STBI__ZFAST_BITS+1; ; ++s) - if (k < z->maxcode[s]) - break; - if (s == 16) return -1; // invalid code! - // code size is s, so: - b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; - STBI_ASSERT(z->size[b] == s); - a->code_buffer >>= s; - a->num_bits -= s; - return z->value[b]; -} - -stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) -{ - int b,s; - if (a->num_bits < 16) stbi__fill_bits(a); - b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; - if (b) { - s = b >> 9; - a->code_buffer >>= s; - a->num_bits -= s; - return b & 511; - } - return stbi__zhuffman_decode_slowpath(a, z); -} - -static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes -{ - char *q; - int cur, limit, old_limit; - z->zout = zout; - if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); - cur = (int) (z->zout - z->zout_start); - limit = old_limit = (int) (z->zout_end - z->zout_start); - while (cur + n > limit) - limit *= 2; - q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); - STBI_NOTUSED(old_limit); - if (q == NULL) return stbi__err("outofmem", "Out of memory"); - z->zout_start = q; - z->zout = q + cur; - z->zout_end = q + limit; - return 1; -} - -static int stbi__zlength_base[31] = { - 3,4,5,6,7,8,9,10,11,13, - 15,17,19,23,27,31,35,43,51,59, - 67,83,99,115,131,163,195,227,258,0,0 }; - -static int stbi__zlength_extra[31]= -{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - -static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, -257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - -static int stbi__zdist_extra[32] = -{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -static int stbi__parse_huffman_block(stbi__zbuf *a) -{ - char *zout = a->zout; - for(;;) { - int z = stbi__zhuffman_decode(a, &a->z_length); - if (z < 256) { - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes - if (zout >= a->zout_end) { - if (!stbi__zexpand(a, zout, 1)) return 0; - zout = a->zout; - } - *zout++ = (char) z; - } else { - stbi_uc *p; - int len,dist; - if (z == 256) { - a->zout = zout; - return 1; - } - z -= 257; - len = stbi__zlength_base[z]; - if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); - z = stbi__zhuffman_decode(a, &a->z_distance); - if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); - dist = stbi__zdist_base[z]; - if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); - if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); - if (zout + len > a->zout_end) { - if (!stbi__zexpand(a, zout, len)) return 0; - zout = a->zout; - } - p = (stbi_uc *) (zout - dist); - if (dist == 1) { // run of one byte; common in images. - stbi_uc v = *p; - if (len) { do *zout++ = v; while (--len); } - } else { - if (len) { do *zout++ = *p++; while (--len); } - } - } - } -} - -static int stbi__compute_huffman_codes(stbi__zbuf *a) -{ - static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - stbi__zhuffman z_codelength; - stbi_uc lencodes[286+32+137];//padding for maximum single op - stbi_uc codelength_sizes[19]; - int i,n; - - int hlit = stbi__zreceive(a,5) + 257; - int hdist = stbi__zreceive(a,5) + 1; - int hclen = stbi__zreceive(a,4) + 4; - int ntot = hlit + hdist; - - memset(codelength_sizes, 0, sizeof(codelength_sizes)); - for (i=0; i < hclen; ++i) { - int s = stbi__zreceive(a,3); - codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; - } - if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; - - n = 0; - while (n < ntot) { - int c = stbi__zhuffman_decode(a, &z_codelength); - if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); - if (c < 16) - lencodes[n++] = (stbi_uc) c; - else { - stbi_uc fill = 0; - if (c == 16) { - c = stbi__zreceive(a,2)+3; - if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); - fill = lencodes[n-1]; - } else if (c == 17) - c = stbi__zreceive(a,3)+3; - else { - STBI_ASSERT(c == 18); - c = stbi__zreceive(a,7)+11; - } - if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); - memset(lencodes+n, fill, c); - n += c; - } - } - if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); - if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; - return 1; -} - -static int stbi__parse_uncompressed_block(stbi__zbuf *a) -{ - stbi_uc header[4]; - int len,nlen,k; - if (a->num_bits & 7) - stbi__zreceive(a, a->num_bits & 7); // discard - // drain the bit-packed data into header - k = 0; - while (a->num_bits > 0) { - header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check - a->code_buffer >>= 8; - a->num_bits -= 8; - } - STBI_ASSERT(a->num_bits == 0); - // now fill header the normal way - while (k < 4) - header[k++] = stbi__zget8(a); - len = header[1] * 256 + header[0]; - nlen = header[3] * 256 + header[2]; - if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); - if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); - if (a->zout + len > a->zout_end) - if (!stbi__zexpand(a, a->zout, len)) return 0; - memcpy(a->zout, a->zbuffer, len); - a->zbuffer += len; - a->zout += len; - return 1; -} - -static int stbi__parse_zlib_header(stbi__zbuf *a) -{ - int cmf = stbi__zget8(a); - int cm = cmf & 15; - /* int cinfo = cmf >> 4; */ - int flg = stbi__zget8(a); - if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec - if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png - if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png - // window = 1 << (8 + cinfo)... but who cares, we fully buffer output - return 1; -} - -static const stbi_uc stbi__zdefault_length[288] = -{ - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 -}; -static const stbi_uc stbi__zdefault_distance[32] = -{ - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 -}; -/* -Init algorithm: -{ - int i; // use <= to match clearly with spec - for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; - for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; - for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; - for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; - - for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; -} -*/ - -static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) -{ - int final, type; - if (parse_header) - if (!stbi__parse_zlib_header(a)) return 0; - a->num_bits = 0; - a->code_buffer = 0; - do { - final = stbi__zreceive(a,1); - type = stbi__zreceive(a,2); - if (type == 0) { - if (!stbi__parse_uncompressed_block(a)) return 0; - } else if (type == 3) { - return 0; - } else { - if (type == 1) { - // use fixed code lengths - if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; - if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; - } else { - if (!stbi__compute_huffman_codes(a)) return 0; - } - if (!stbi__parse_huffman_block(a)) return 0; - } - } while (!final); - return 1; -} - -static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) -{ - a->zout_start = obuf; - a->zout = obuf; - a->zout_end = obuf + olen; - a->z_expandable = exp; - - return stbi__parse_zlib(a, parse_header); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) -{ - return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); -} - -STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(initial_size); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer + len; - if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) - return (int) (a.zout - a.zout_start); - else - return -1; -} - -STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) -{ - stbi__zbuf a; - char *p = (char *) stbi__malloc(16384); - if (p == NULL) return NULL; - a.zbuffer = (stbi_uc *) buffer; - a.zbuffer_end = (stbi_uc *) buffer+len; - if (stbi__do_zlib(&a, p, 16384, 1, 0)) { - if (outlen) *outlen = (int) (a.zout - a.zout_start); - return a.zout_start; - } else { - STBI_FREE(a.zout_start); - return NULL; - } -} - -STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) -{ - stbi__zbuf a; - a.zbuffer = (stbi_uc *) ibuffer; - a.zbuffer_end = (stbi_uc *) ibuffer + ilen; - if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) - return (int) (a.zout - a.zout_start); - else - return -1; -} -#endif - -// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 -// simple implementation -// - only 8-bit samples -// - no CRC checking -// - allocates lots of intermediate memory -// - avoids problem of streaming data between subsystems -// - avoids explicit window management -// performance -// - uses stb_zlib, a PD zlib implementation with fast huffman decoding - -#ifndef STBI_NO_PNG -typedef struct -{ - stbi__uint32 length; - stbi__uint32 type; -} stbi__pngchunk; - -static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) -{ - stbi__pngchunk c; - c.length = stbi__get32be(s); - c.type = stbi__get32be(s); - return c; -} - -static int stbi__check_png_header(stbi__context *s) -{ - static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; - int i; - for (i=0; i < 8; ++i) - if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); - return 1; -} - -typedef struct -{ - stbi__context *s; - stbi_uc *idata, *expanded, *out; - int depth; -} stbi__png; - - -enum { - STBI__F_none=0, - STBI__F_sub=1, - STBI__F_up=2, - STBI__F_avg=3, - STBI__F_paeth=4, - // synthetic filters used for first scanline to avoid needing a dummy row of 0s - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static stbi_uc first_row_filter[5] = -{ - STBI__F_none, - STBI__F_sub, - STBI__F_none, - STBI__F_avg_first, - STBI__F_paeth_first -}; - -static int stbi__paeth(int a, int b, int c) -{ - int p = a + b - c; - int pa = abs(p-a); - int pb = abs(p-b); - int pc = abs(p-c); - if (pa <= pb && pa <= pc) return a; - if (pb <= pc) return b; - return c; -} - -static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; - -// create the png data from post-deflated data -static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) -{ - int bytes = (depth == 16? 2 : 1); - stbi__context *s = a->s; - stbi__uint32 i,j,stride = x*out_n*bytes; - stbi__uint32 img_len, img_width_bytes; - int k; - int img_n = s->img_n; // copy it into a local for later - - int output_bytes = out_n*bytes; - int filter_bytes = img_n*bytes; - int width = x; - - STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); - a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into - if (!a->out) return stbi__err("outofmem", "Out of memory"); - - img_width_bytes = (((img_n * x * depth) + 7) >> 3); - img_len = (img_width_bytes + 1) * y; - // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, - // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), - // so just check for raw_len < img_len always. - if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); - - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *prior; - int filter = *raw++; - - if (filter > 4) - return stbi__err("invalid filter","Corrupt PNG"); - - if (depth < 8) { - STBI_ASSERT(img_width_bytes <= x); - cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place - filter_bytes = 1; - width = img_width_bytes; - } - prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above - - // if first row, use special filter that doesn't sample previous row - if (j == 0) filter = first_row_filter[filter]; - - // handle first byte explicitly - for (k=0; k < filter_bytes; ++k) { - switch (filter) { - case STBI__F_none : cur[k] = raw[k]; break; - case STBI__F_sub : cur[k] = raw[k]; break; - case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; - case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; - case STBI__F_avg_first : cur[k] = raw[k]; break; - case STBI__F_paeth_first: cur[k] = raw[k]; break; - } - } - - if (depth == 8) { - if (img_n != out_n) - cur[img_n] = 255; // first pixel - raw += img_n; - cur += out_n; - prior += out_n; - } else if (depth == 16) { - if (img_n != out_n) { - cur[filter_bytes] = 255; // first pixel top byte - cur[filter_bytes+1] = 255; // first pixel bottom byte - } - raw += filter_bytes; - cur += output_bytes; - prior += output_bytes; - } else { - raw += 1; - cur += 1; - prior += 1; - } - - // this is a little gross, so that we don't switch per-pixel or per-component - if (depth < 8 || img_n == out_n) { - int nk = (width - 1)*filter_bytes; - #define STBI__CASE(f) \ - case f: \ - for (k=0; k < nk; ++k) - switch (filter) { - // "none" filter turns into a memcpy here; make that explicit. - case STBI__F_none: memcpy(cur, raw, nk); break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; - } - #undef STBI__CASE - raw += nk; - } else { - STBI_ASSERT(img_n+1 == out_n); - #define STBI__CASE(f) \ - case f: \ - for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ - for (k=0; k < filter_bytes; ++k) - switch (filter) { - STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; - } - #undef STBI__CASE - - // the loop above sets the high byte of the pixels' alpha, but for - // 16 bit png files we also need the low byte set. we'll do that here. - if (depth == 16) { - cur = a->out + stride*j; // start at the beginning of the row again - for (i=0; i < x; ++i,cur+=output_bytes) { - cur[filter_bytes+1] = 255; - } - } - } - } - - // we make a separate pass to expand bits to pixels; for performance, - // this could run two scanlines behind the above code, so it won't - // intefere with filtering but will still be in the cache. - if (depth < 8) { - for (j=0; j < y; ++j) { - stbi_uc *cur = a->out + stride*j; - stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; - // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit - // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop - stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range - - // note that the final byte might overshoot and write more data than desired. - // we can allocate enough data that this never writes out of memory, but it - // could also overwrite the next scanline. can it overwrite non-empty data - // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. - // so we need to explicitly clamp the final ones - - if (depth == 4) { - for (k=x*img_n; k >= 2; k-=2, ++in) { - *cur++ = scale * ((*in >> 4) ); - *cur++ = scale * ((*in ) & 0x0f); - } - if (k > 0) *cur++ = scale * ((*in >> 4) ); - } else if (depth == 2) { - for (k=x*img_n; k >= 4; k-=4, ++in) { - *cur++ = scale * ((*in >> 6) ); - *cur++ = scale * ((*in >> 4) & 0x03); - *cur++ = scale * ((*in >> 2) & 0x03); - *cur++ = scale * ((*in ) & 0x03); - } - if (k > 0) *cur++ = scale * ((*in >> 6) ); - if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); - if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); - } else if (depth == 1) { - for (k=x*img_n; k >= 8; k-=8, ++in) { - *cur++ = scale * ((*in >> 7) ); - *cur++ = scale * ((*in >> 6) & 0x01); - *cur++ = scale * ((*in >> 5) & 0x01); - *cur++ = scale * ((*in >> 4) & 0x01); - *cur++ = scale * ((*in >> 3) & 0x01); - *cur++ = scale * ((*in >> 2) & 0x01); - *cur++ = scale * ((*in >> 1) & 0x01); - *cur++ = scale * ((*in ) & 0x01); - } - if (k > 0) *cur++ = scale * ((*in >> 7) ); - if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); - if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); - if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); - if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); - if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); - if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); - } - if (img_n != out_n) { - int q; - // insert alpha = 255 - cur = a->out + stride*j; - if (img_n == 1) { - for (q=x-1; q >= 0; --q) { - cur[q*2+1] = 255; - cur[q*2+0] = cur[q]; - } - } else { - STBI_ASSERT(img_n == 3); - for (q=x-1; q >= 0; --q) { - cur[q*4+3] = 255; - cur[q*4+2] = cur[q*3+2]; - cur[q*4+1] = cur[q*3+1]; - cur[q*4+0] = cur[q*3+0]; - } - } - } - } - } else if (depth == 16) { - // force the image data from big-endian to platform-native. - // this is done in a separate pass due to the decoding relying - // on the data being untouched, but could probably be done - // per-line during decode if care is taken. - stbi_uc *cur = a->out; - stbi__uint16 *cur16 = (stbi__uint16*)cur; - - for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { - *cur16 = (cur[0] << 8) | cur[1]; - } - } - - return 1; -} - -static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) -{ - int bytes = (depth == 16 ? 2 : 1); - int out_bytes = out_n * bytes; - stbi_uc *final; - int p; - if (!interlaced) - return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); - - // de-interlacing - final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); - for (p=0; p < 7; ++p) { - int xorig[] = { 0,4,0,2,0,1,0 }; - int yorig[] = { 0,0,4,0,2,0,1 }; - int xspc[] = { 8,8,4,4,2,2,1 }; - int yspc[] = { 8,8,8,4,4,2,2 }; - int i,j,x,y; - // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 - x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; - y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; - if (x && y) { - stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; - if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { - STBI_FREE(final); - return 0; - } - for (j=0; j < y; ++j) { - for (i=0; i < x; ++i) { - int out_y = j*yspc[p]+yorig[p]; - int out_x = i*xspc[p]+xorig[p]; - memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, - a->out + (j*x+i)*out_bytes, out_bytes); - } - } - STBI_FREE(a->out); - image_data += img_len; - image_data_len -= img_len; - } - } - a->out = final; - - return 1; -} - -static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - // compute color-based transparency, assuming we've - // already got 255 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i=0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 255); - p += 2; - } - } else { - for (i=0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi__uint16 *p = (stbi__uint16*) z->out; - - // compute color-based transparency, assuming we've - // already got 65535 as the alpha value in the output - STBI_ASSERT(out_n == 2 || out_n == 4); - - if (out_n == 2) { - for (i = 0; i < pixel_count; ++i) { - p[1] = (p[0] == tc[0] ? 0 : 65535); - p += 2; - } - } else { - for (i = 0; i < pixel_count; ++i) { - if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) - p[3] = 0; - p += 4; - } - } - return 1; -} - -static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) -{ - stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; - stbi_uc *p, *temp_out, *orig = a->out; - - p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); - if (p == NULL) return stbi__err("outofmem", "Out of memory"); - - // between here and free(out) below, exitting would leak - temp_out = p; - - if (pal_img_n == 3) { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p += 3; - } - } else { - for (i=0; i < pixel_count; ++i) { - int n = orig[i]*4; - p[0] = palette[n ]; - p[1] = palette[n+1]; - p[2] = palette[n+2]; - p[3] = palette[n+3]; - p += 4; - } - } - STBI_FREE(a->out); - a->out = temp_out; - - STBI_NOTUSED(len); - - return 1; -} - -static int stbi__unpremultiply_on_load = 0; -static int stbi__de_iphone_flag = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag = flag_true_if_should_convert; -} - -static void stbi__de_iphone(stbi__png *z) -{ - stbi__context *s = z->s; - stbi__uint32 i, pixel_count = s->img_x * s->img_y; - stbi_uc *p = z->out; - - if (s->img_out_n == 3) { // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 3; - } - } else { - STBI_ASSERT(s->img_out_n == 4); - if (stbi__unpremultiply_on_load) { - // convert bgr to rgb and unpremultiply - for (i=0; i < pixel_count; ++i) { - stbi_uc a = p[3]; - stbi_uc t = p[0]; - if (a) { - stbi_uc half = a / 2; - p[0] = (p[2] * 255 + half) / a; - p[1] = (p[1] * 255 + half) / a; - p[2] = ( t * 255 + half) / a; - } else { - p[0] = p[2]; - p[2] = t; - } - p += 4; - } - } else { - // convert bgr to rgb - for (i=0; i < pixel_count; ++i) { - stbi_uc t = p[0]; - p[0] = p[2]; - p[2] = t; - p += 4; - } - } - } -} - -#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) - -static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) -{ - stbi_uc palette[1024], pal_img_n=0; - stbi_uc has_trans=0, tc[3]; - stbi__uint16 tc16[3]; - stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; - int first=1,k,interlace=0, color=0, is_iphone=0; - stbi__context *s = z->s; - - z->expanded = NULL; - z->idata = NULL; - z->out = NULL; - - if (!stbi__check_png_header(s)) return 0; - - if (scan == STBI__SCAN_type) return 1; - - for (;;) { - stbi__pngchunk c = stbi__get_chunk_header(s); - switch (c.type) { - case STBI__PNG_TYPE('C','g','B','I'): - is_iphone = 1; - stbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I','H','D','R'): { - int comp,filter; - if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); - first = 0; - if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); - s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); - z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); - color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); - if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); - comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); - filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); - interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); - if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); - if (scan == STBI__SCAN_header) return 1; - } else { - // if paletted, then pal_n is our final components, and - // img_n is # components to decompress/filter. - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); - // if SCAN_header, have to scan to see if we have a tRNS - } - break; - } - - case STBI__PNG_TYPE('P','L','T','E'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); - for (i=0; i < pal_len; ++i) { - palette[i*4+0] = stbi__get8(s); - palette[i*4+1] = stbi__get8(s); - palette[i*4+2] = stbi__get8(s); - palette[i*4+3] = 255; - } - break; - } - - case STBI__PNG_TYPE('t','R','N','S'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } - if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); - if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); - pal_img_n = 4; - for (i=0; i < c.length; ++i) - palette[i*4+3] = stbi__get8(s); - } else { - if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); - if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); - has_trans = 1; - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is - } else { - for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger - } - } - break; - } - - case STBI__PNG_TYPE('I','D','A','T'): { - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); - if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - stbi__uint32 idata_limit_old = idata_limit; - stbi_uc *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); - z->idata = p; - } - if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); - ioff += c.length; - break; - } - - case STBI__PNG_TYPE('I','E','N','D'): { - stbi__uint32 raw_len, bpl; - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); - // initial guess for decoded data size to avoid unnecessary reallocs - bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); - if (z->expanded == NULL) return 0; // zlib should set error - STBI_FREE(z->idata); z->idata = NULL; - if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n+1; - else - s->img_out_n = s->img_n; - if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) - stbi__de_iphone(z); - if (pal_img_n) { - // pal_img_n == 3 or 4 - s->img_n = pal_img_n; // record the actual colors we had - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - // non-paletted image with tRNS -> source image has (constant) alpha - ++s->img_n; - } - STBI_FREE(z->expanded); z->expanded = NULL; - return 1; - } - - default: - // if critical, fail - if (first) return stbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - #ifndef STBI_NO_FAILURE_STRINGS - // not threadsafe - static char invalid_chunk[] = "XXXX PNG chunk not known"; - invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); - invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); - invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); - invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); - #endif - return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); - } - stbi__skip(s, c.length); - break; - } - // end of PNG chunk, read and skip CRC - stbi__get32be(s); - } -} - -static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) -{ - void *result=NULL; - if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); - if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { - if (p->depth < 8) - ri->bits_per_channel = 8; - else - ri->bits_per_channel = p->depth; - result = p->out; - p->out = NULL; - if (req_comp && req_comp != p->s->img_out_n) { - if (ri->bits_per_channel == 8) - result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - else - result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); - p->s->img_out_n = req_comp; - if (result == NULL) return result; - } - *x = p->s->img_x; - *y = p->s->img_y; - if (n) *n = p->s->img_n; - } - STBI_FREE(p->out); p->out = NULL; - STBI_FREE(p->expanded); p->expanded = NULL; - STBI_FREE(p->idata); p->idata = NULL; - - return result; -} - -static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi__png p; - p.s = s; - return stbi__do_png(&p, x,y,comp,req_comp, ri); -} - -static int stbi__png_test(stbi__context *s) -{ - int r; - r = stbi__check_png_header(s); - stbi__rewind(s); - return r; -} - -static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) -{ - if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { - stbi__rewind( p->s ); - return 0; - } - if (x) *x = p->s->img_x; - if (y) *y = p->s->img_y; - if (comp) *comp = p->s->img_n; - return 1; -} - -static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__png p; - p.s = s; - return stbi__png_info_raw(&p, x, y, comp); -} -#endif - -// Microsoft/Windows BMP image - -#ifndef STBI_NO_BMP -static int stbi__bmp_test_raw(stbi__context *s) -{ - int r; - int sz; - if (stbi__get8(s) != 'B') return 0; - if (stbi__get8(s) != 'M') return 0; - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - stbi__get32le(s); // discard data offset - sz = stbi__get32le(s); - r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); - return r; -} - -static int stbi__bmp_test(stbi__context *s) -{ - int r = stbi__bmp_test_raw(s); - stbi__rewind(s); - return r; -} - - -// returns 0..31 for the highest set bit -static int stbi__high_bit(unsigned int z) -{ - int n=0; - if (z == 0) return -1; - if (z >= 0x10000) n += 16, z >>= 16; - if (z >= 0x00100) n += 8, z >>= 8; - if (z >= 0x00010) n += 4, z >>= 4; - if (z >= 0x00004) n += 2, z >>= 2; - if (z >= 0x00002) n += 1, z >>= 1; - return n; -} - -static int stbi__bitcount(unsigned int a) -{ - a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 - a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 - a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits - a = (a + (a >> 8)); // max 16 per 8 bits - a = (a + (a >> 16)); // max 32 per 8 bits - return a & 0xff; -} - -static int stbi__shiftsigned(int v, int shift, int bits) -{ - int result; - int z=0; - - if (shift < 0) v <<= -shift; - else v >>= shift; - result = v; - - z = bits; - while (z < 8) { - result += v >> z; - z += bits; - } - return result; -} - -typedef struct -{ - int bpp, offset, hsz; - unsigned int mr,mg,mb,ma, all_a; -} stbi__bmp_data; - -static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) -{ - int hsz; - if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); - stbi__get32le(s); // discard filesize - stbi__get16le(s); // discard reserved - stbi__get16le(s); // discard reserved - info->offset = stbi__get32le(s); - info->hsz = hsz = stbi__get32le(s); - info->mr = info->mg = info->mb = info->ma = 0; - - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); - if (hsz == 12) { - s->img_x = stbi__get16le(s); - s->img_y = stbi__get16le(s); - } else { - s->img_x = stbi__get32le(s); - s->img_y = stbi__get32le(s); - } - if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); - info->bpp = stbi__get16le(s); - if (info->bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); - if (hsz != 12) { - int compress = stbi__get32le(s); - if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); - stbi__get32le(s); // discard sizeof - stbi__get32le(s); // discard hres - stbi__get32le(s); // discard vres - stbi__get32le(s); // discard colorsused - stbi__get32le(s); // discard max important - if (hsz == 40 || hsz == 56) { - if (hsz == 56) { - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - stbi__get32le(s); - } - if (info->bpp == 16 || info->bpp == 32) { - if (compress == 0) { - if (info->bpp == 32) { - info->mr = 0xffu << 16; - info->mg = 0xffu << 8; - info->mb = 0xffu << 0; - info->ma = 0xffu << 24; - info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 - } else { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } - } else if (compress == 3) { - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - // not documented, but generated by photoshop and handled by mspaint - if (info->mr == info->mg && info->mg == info->mb) { - // ?!?!? - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else - return stbi__errpuc("bad BMP", "bad BMP"); - } - } else { - int i; - if (hsz != 108 && hsz != 124) - return stbi__errpuc("bad BMP", "bad BMP"); - info->mr = stbi__get32le(s); - info->mg = stbi__get32le(s); - info->mb = stbi__get32le(s); - info->ma = stbi__get32le(s); - stbi__get32le(s); // discard color space - for (i=0; i < 12; ++i) - stbi__get32le(s); // discard color space parameters - if (hsz == 124) { - stbi__get32le(s); // discard rendering intent - stbi__get32le(s); // discard offset of profile data - stbi__get32le(s); // discard size of profile data - stbi__get32le(s); // discard reserved - } - } - } - return (void *) 1; -} - - -static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - unsigned int mr=0,mg=0,mb=0,ma=0, all_a; - stbi_uc pal[256][4]; - int psize=0,i,j,width; - int flip_vertically, pad, target; - stbi__bmp_data info; - STBI_NOTUSED(ri); - - info.all_a = 255; - if (stbi__bmp_parse_header(s, &info) == NULL) - return NULL; // error code already set - - flip_vertically = ((int) s->img_y) > 0; - s->img_y = abs((int) s->img_y); - - mr = info.mr; - mg = info.mg; - mb = info.mb; - ma = info.ma; - all_a = info.all_a; - - if (info.hsz == 12) { - if (info.bpp < 24) - psize = (info.offset - 14 - 24) / 3; - } else { - if (info.bpp < 16) - psize = (info.offset - 14 - info.hsz) >> 2; - } - - s->img_n = ma ? 4 : 3; - if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 - target = req_comp; - else - target = s->img_n; // if they want monochrome, we'll post-convert - - // sanity-check size - if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "Corrupt BMP"); - - out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - if (info.bpp < 16) { - int z=0; - if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } - for (i=0; i < psize; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - if (info.hsz != 12) stbi__get8(s); - pal[i][3] = 255; - } - stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); - if (info.bpp == 4) width = (s->img_x + 1) >> 1; - else if (info.bpp == 8) width = s->img_x; - else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } - pad = (-width)&3; - for (j=0; j < (int) s->img_y; ++j) { - for (i=0; i < (int) s->img_x; i += 2) { - int v=stbi__get8(s),v2=0; - if (info.bpp == 4) { - v2 = v & 15; - v >>= 4; - } - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - if (i+1 == (int) s->img_x) break; - v = (info.bpp == 8) ? stbi__get8(s) : v2; - out[z++] = pal[v][0]; - out[z++] = pal[v][1]; - out[z++] = pal[v][2]; - if (target == 4) out[z++] = 255; - } - stbi__skip(s, pad); - } - } else { - int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; - int z = 0; - int easy=0; - stbi__skip(s, info.offset - 14 - info.hsz); - if (info.bpp == 24) width = 3 * s->img_x; - else if (info.bpp == 16) width = 2*s->img_x; - else /* bpp = 32 and pad = 0 */ width=0; - pad = (-width) & 3; - if (info.bpp == 24) { - easy = 1; - } else if (info.bpp == 32) { - if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) - easy = 2; - } - if (!easy) { - if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } - // right shift amt to put high bit in position #7 - rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); - gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); - bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); - ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); - } - for (j=0; j < (int) s->img_y; ++j) { - if (easy) { - for (i=0; i < (int) s->img_x; ++i) { - unsigned char a; - out[z+2] = stbi__get8(s); - out[z+1] = stbi__get8(s); - out[z+0] = stbi__get8(s); - z += 3; - a = (easy == 2 ? stbi__get8(s) : 255); - all_a |= a; - if (target == 4) out[z++] = a; - } - } else { - int bpp = info.bpp; - for (i=0; i < (int) s->img_x; ++i) { - stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); - int a; - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); - out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); - a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); - all_a |= a; - if (target == 4) out[z++] = STBI__BYTECAST(a); - } - } - stbi__skip(s, pad); - } - } - - // if alpha channel is all 0s, replace with all 255s - if (target == 4 && all_a == 0) - for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) - out[i] = 255; - - if (flip_vertically) { - stbi_uc t; - for (j=0; j < (int) s->img_y>>1; ++j) { - stbi_uc *p1 = out + j *s->img_x*target; - stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; - for (i=0; i < (int) s->img_x*target; ++i) { - t = p1[i], p1[i] = p2[i], p2[i] = t; - } - } - } - - if (req_comp && req_comp != target) { - out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - return out; -} -#endif - -// Targa Truevision - TGA -// by Jonathan Dummer -#ifndef STBI_NO_TGA -// returns STBI_rgb or whatever, 0 on error -static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) -{ - // only RGB or RGBA (incl. 16bit) or grey allowed - if(is_rgb16) *is_rgb16 = 0; - switch(bits_per_pixel) { - case 8: return STBI_grey; - case 16: if(is_grey) return STBI_grey_alpha; - // else: fall-through - case 15: if(is_rgb16) *is_rgb16 = 1; - return STBI_rgb; - case 24: // fall-through - case 32: return bits_per_pixel/8; - default: return 0; - } -} - -static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) -{ - int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; - int sz, tga_colormap_type; - stbi__get8(s); // discard Offset - tga_colormap_type = stbi__get8(s); // colormap type - if( tga_colormap_type > 1 ) { - stbi__rewind(s); - return 0; // only RGB or indexed allowed - } - tga_image_type = stbi__get8(s); // image type - if ( tga_colormap_type == 1 ) { // colormapped (paletted) image - if (tga_image_type != 1 && tga_image_type != 9) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { - stbi__rewind(s); - return 0; - } - stbi__skip(s,4); // skip image x and y origin - tga_colormap_bpp = sz; - } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE - if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { - stbi__rewind(s); - return 0; // only RGB or grey allowed, +/- RLE - } - stbi__skip(s,9); // skip colormap specification and image x/y origin - tga_colormap_bpp = 0; - } - tga_w = stbi__get16le(s); - if( tga_w < 1 ) { - stbi__rewind(s); - return 0; // test width - } - tga_h = stbi__get16le(s); - if( tga_h < 1 ) { - stbi__rewind(s); - return 0; // test height - } - tga_bits_per_pixel = stbi__get8(s); // bits per pixel - stbi__get8(s); // ignore alpha bits - if (tga_colormap_bpp != 0) { - if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { - // when using a colormap, tga_bits_per_pixel is the size of the indexes - // I don't think anything but 8 or 16bit indexes makes sense - stbi__rewind(s); - return 0; - } - tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); - } else { - tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); - } - if(!tga_comp) { - stbi__rewind(s); - return 0; - } - if (x) *x = tga_w; - if (y) *y = tga_h; - if (comp) *comp = tga_comp; - return 1; // seems to have passed everything -} - -static int stbi__tga_test(stbi__context *s) -{ - int res = 0; - int sz, tga_color_type; - stbi__get8(s); // discard Offset - tga_color_type = stbi__get8(s); // color type - if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed - sz = stbi__get8(s); // image type - if ( tga_color_type == 1 ) { // colormapped (paletted) image - if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 - stbi__skip(s,4); // skip index of first colormap entry and number of entries - sz = stbi__get8(s); // check bits per palette color entry - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - stbi__skip(s,4); // skip image x and y origin - } else { // "normal" image w/o colormap - if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE - stbi__skip(s,9); // skip colormap specification and image x/y origin - } - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width - if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height - sz = stbi__get8(s); // bits per pixel - if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index - if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; - - res = 1; // if we got this far, everything's good and we can return 1 instead of 0 - -errorEnd: - stbi__rewind(s); - return res; -} - -// read 16bit value and convert to 24bit RGB -static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) -{ - stbi__uint16 px = (stbi__uint16)stbi__get16le(s); - stbi__uint16 fiveBitMask = 31; - // we have 3 channels with 5bits each - int r = (px >> 10) & fiveBitMask; - int g = (px >> 5) & fiveBitMask; - int b = px & fiveBitMask; - // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later - out[0] = (stbi_uc)((r * 255)/31); - out[1] = (stbi_uc)((g * 255)/31); - out[2] = (stbi_uc)((b * 255)/31); - - // some people claim that the most significant bit might be used for alpha - // (possibly if an alpha-bit is set in the "image descriptor byte") - // but that only made 16bit test images completely translucent.. - // so let's treat all 15 and 16bit TGAs as RGB with no alpha. -} - -static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - // read in the TGA header stuff - int tga_offset = stbi__get8(s); - int tga_indexed = stbi__get8(s); - int tga_image_type = stbi__get8(s); - int tga_is_RLE = 0; - int tga_palette_start = stbi__get16le(s); - int tga_palette_len = stbi__get16le(s); - int tga_palette_bits = stbi__get8(s); - int tga_x_origin = stbi__get16le(s); - int tga_y_origin = stbi__get16le(s); - int tga_width = stbi__get16le(s); - int tga_height = stbi__get16le(s); - int tga_bits_per_pixel = stbi__get8(s); - int tga_comp, tga_rgb16=0; - int tga_inverted = stbi__get8(s); - // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) - // image data - unsigned char *tga_data; - unsigned char *tga_palette = NULL; - int i, j; - unsigned char raw_data[4] = {0}; - int RLE_count = 0; - int RLE_repeating = 0; - int read_next_pixel = 1; - STBI_NOTUSED(ri); - - // do a tiny bit of precessing - if ( tga_image_type >= 8 ) - { - tga_image_type -= 8; - tga_is_RLE = 1; - } - tga_inverted = 1 - ((tga_inverted >> 5) & 1); - - // If I'm paletted, then I'll use the number of bits from the palette - if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); - else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); - - if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency - return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); - - // tga info - *x = tga_width; - *y = tga_height; - if (comp) *comp = tga_comp; - - if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) - return stbi__errpuc("too large", "Corrupt TGA"); - - tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); - if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); - - // skip to the data's starting position (offset usually = 0) - stbi__skip(s, tga_offset ); - - if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { - for (i=0; i < tga_height; ++i) { - int row = tga_inverted ? tga_height -i - 1 : i; - stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; - stbi__getn(s, tga_row, tga_width * tga_comp); - } - } else { - // do I need to load a palette? - if ( tga_indexed) - { - // any data to skip? (offset usually = 0) - stbi__skip(s, tga_palette_start ); - // load the palette - tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); - if (!tga_palette) { - STBI_FREE(tga_data); - return stbi__errpuc("outofmem", "Out of memory"); - } - if (tga_rgb16) { - stbi_uc *pal_entry = tga_palette; - STBI_ASSERT(tga_comp == STBI_rgb); - for (i=0; i < tga_palette_len; ++i) { - stbi__tga_read_rgb16(s, pal_entry); - pal_entry += tga_comp; - } - } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { - STBI_FREE(tga_data); - STBI_FREE(tga_palette); - return stbi__errpuc("bad palette", "Corrupt TGA"); - } - } - // load the data - for (i=0; i < tga_width * tga_height; ++i) - { - // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? - if ( tga_is_RLE ) - { - if ( RLE_count == 0 ) - { - // yep, get the next byte as a RLE command - int RLE_cmd = stbi__get8(s); - RLE_count = 1 + (RLE_cmd & 127); - RLE_repeating = RLE_cmd >> 7; - read_next_pixel = 1; - } else if ( !RLE_repeating ) - { - read_next_pixel = 1; - } - } else - { - read_next_pixel = 1; - } - // OK, if I need to read a pixel, do it now - if ( read_next_pixel ) - { - // load however much data we did have - if ( tga_indexed ) - { - // read in index, then perform the lookup - int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); - if ( pal_idx >= tga_palette_len ) { - // invalid index - pal_idx = 0; - } - pal_idx *= tga_comp; - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = tga_palette[pal_idx+j]; - } - } else if(tga_rgb16) { - STBI_ASSERT(tga_comp == STBI_rgb); - stbi__tga_read_rgb16(s, raw_data); - } else { - // read in the data raw - for (j = 0; j < tga_comp; ++j) { - raw_data[j] = stbi__get8(s); - } - } - // clear the reading flag for the next pixel - read_next_pixel = 0; - } // end of reading a pixel - - // copy data - for (j = 0; j < tga_comp; ++j) - tga_data[i*tga_comp+j] = raw_data[j]; - - // in case we're in RLE mode, keep counting down - --RLE_count; - } - // do I need to invert the image? - if ( tga_inverted ) - { - for (j = 0; j*2 < tga_height; ++j) - { - int index1 = j * tga_width * tga_comp; - int index2 = (tga_height - 1 - j) * tga_width * tga_comp; - for (i = tga_width * tga_comp; i > 0; --i) - { - unsigned char temp = tga_data[index1]; - tga_data[index1] = tga_data[index2]; - tga_data[index2] = temp; - ++index1; - ++index2; - } - } - } - // clear my palette, if I had one - if ( tga_palette != NULL ) - { - STBI_FREE( tga_palette ); - } - } - - // swap RGB - if the source data was RGB16, it already is in the right order - if (tga_comp >= 3 && !tga_rgb16) - { - unsigned char* tga_pixel = tga_data; - for (i=0; i < tga_width * tga_height; ++i) - { - unsigned char temp = tga_pixel[0]; - tga_pixel[0] = tga_pixel[2]; - tga_pixel[2] = temp; - tga_pixel += tga_comp; - } - } - - // convert to target component count - if (req_comp && req_comp != tga_comp) - tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); - - // the things I do to get rid of an error message, and yet keep - // Microsoft's C compilers happy... [8^( - tga_palette_start = tga_palette_len = tga_palette_bits = - tga_x_origin = tga_y_origin = 0; - // OK, done - return tga_data; -} -#endif - -// ************************************************************************************************* -// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB - -#ifndef STBI_NO_PSD -static int stbi__psd_test(stbi__context *s) -{ - int r = (stbi__get32be(s) == 0x38425053); - stbi__rewind(s); - return r; -} - -static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) -{ - int count, nleft, len; - - count = 0; - while ((nleft = pixelCount - count) > 0) { - len = stbi__get8(s); - if (len == 128) { - // No-op. - } else if (len < 128) { - // Copy next len+1 bytes literally. - len++; - if (len > nleft) return 0; // corrupt data - count += len; - while (len) { - *p = stbi__get8(s); - p += 4; - len--; - } - } else if (len > 128) { - stbi_uc val; - // Next -len+1 bytes in the dest are replicated from next source byte. - // (Interpret len as a negative 8-bit int.) - len = 257 - len; - if (len > nleft) return 0; // corrupt data - val = stbi__get8(s); - count += len; - while (len) { - *p = val; - p += 4; - len--; - } - } - } - - return 1; -} - -static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) -{ - int pixelCount; - int channelCount, compression; - int channel, i; - int bitdepth; - int w,h; - stbi_uc *out; - STBI_NOTUSED(ri); - - // Check identifier - if (stbi__get32be(s) != 0x38425053) // "8BPS" - return stbi__errpuc("not PSD", "Corrupt PSD image"); - - // Check file type version. - if (stbi__get16be(s) != 1) - return stbi__errpuc("wrong version", "Unsupported version of PSD image"); - - // Skip 6 reserved bytes. - stbi__skip(s, 6 ); - - // Read the number of channels (R, G, B, A, etc). - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) - return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); - - // Read the rows and columns of the image. - h = stbi__get32be(s); - w = stbi__get32be(s); - - // Make sure the depth is 8 bits. - bitdepth = stbi__get16be(s); - if (bitdepth != 8 && bitdepth != 16) - return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); - - // Make sure the color mode is RGB. - // Valid options are: - // 0: Bitmap - // 1: Grayscale - // 2: Indexed color - // 3: RGB color - // 4: CMYK color - // 7: Multichannel - // 8: Duotone - // 9: Lab color - if (stbi__get16be(s) != 3) - return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); - - // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) - stbi__skip(s,stbi__get32be(s) ); - - // Skip the image resources. (resolution, pen tool paths, etc) - stbi__skip(s, stbi__get32be(s) ); - - // Skip the reserved data. - stbi__skip(s, stbi__get32be(s) ); - - // Find out if the data is compressed. - // Known values: - // 0: no compression - // 1: RLE compressed - compression = stbi__get16be(s); - if (compression > 1) - return stbi__errpuc("bad compression", "PSD has an unknown compression format"); - - // Check size - if (!stbi__mad3sizes_valid(4, w, h, 0)) - return stbi__errpuc("too large", "Corrupt PSD"); - - // Create the destination image. - - if (!compression && bitdepth == 16 && bpc == 16) { - out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); - ri->bits_per_channel = 16; - } else - out = (stbi_uc *) stbi__malloc(4 * w*h); - - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - pixelCount = w*h; - - // Initialize the data to zero. - //memset( out, 0, pixelCount * 4 ); - - // Finally, the image data. - if (compression) { - // RLE as used by .PSD and .TIFF - // Loop until you get the number of unpacked bytes you are expecting: - // Read the next source byte into n. - // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. - // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. - // Else if n is 128, noop. - // Endloop - - // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, - // which we're going to just skip. - stbi__skip(s, h * channelCount * 2 ); - - // Read the RLE data by channel. - for (channel = 0; channel < 4; channel++) { - stbi_uc *p; - - p = out+channel; - if (channel >= channelCount) { - // Fill this channel with default data. - for (i = 0; i < pixelCount; i++, p += 4) - *p = (channel == 3 ? 255 : 0); - } else { - // Read the RLE data. - if (!stbi__psd_decode_rle(s, p, pixelCount)) { - STBI_FREE(out); - return stbi__errpuc("corrupt", "bad RLE data"); - } - } - } - - } else { - // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) - // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. - - // Read the data by channel. - for (channel = 0; channel < 4; channel++) { - if (channel >= channelCount) { - // Fill this channel with default data. - if (bitdepth == 16 && bpc == 16) { - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - stbi__uint16 val = channel == 3 ? 65535 : 0; - for (i = 0; i < pixelCount; i++, q += 4) - *q = val; - } else { - stbi_uc *p = out+channel; - stbi_uc val = channel == 3 ? 255 : 0; - for (i = 0; i < pixelCount; i++, p += 4) - *p = val; - } - } else { - if (ri->bits_per_channel == 16) { // output bpc - stbi__uint16 *q = ((stbi__uint16 *) out) + channel; - for (i = 0; i < pixelCount; i++, q += 4) - *q = (stbi__uint16) stbi__get16be(s); - } else { - stbi_uc *p = out+channel; - if (bitdepth == 16) { // input bpc - for (i = 0; i < pixelCount; i++, p += 4) - *p = (stbi_uc) (stbi__get16be(s) >> 8); - } else { - for (i = 0; i < pixelCount; i++, p += 4) - *p = stbi__get8(s); - } - } - } - } - } - - // remove weird white matte from PSD - if (channelCount >= 4) { - if (ri->bits_per_channel == 16) { - for (i=0; i < w*h; ++i) { - stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; - if (pixel[3] != 0 && pixel[3] != 65535) { - float a = pixel[3] / 65535.0f; - float ra = 1.0f / a; - float inv_a = 65535.0f * (1 - ra); - pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); - pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); - pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); - } - } - } else { - for (i=0; i < w*h; ++i) { - unsigned char *pixel = out + 4*i; - if (pixel[3] != 0 && pixel[3] != 255) { - float a = pixel[3] / 255.0f; - float ra = 1.0f / a; - float inv_a = 255.0f * (1 - ra); - pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); - pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); - pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); - } - } - } - } - - // convert to desired output format - if (req_comp && req_comp != 4) { - if (ri->bits_per_channel == 16) - out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); - else - out = stbi__convert_format(out, 4, req_comp, w, h); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - - if (comp) *comp = 4; - *y = h; - *x = w; - - return out; -} -#endif - -// ************************************************************************************************* -// Softimage PIC loader -// by Tom Seddon -// -// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format -// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ - -#ifndef STBI_NO_PIC -static int stbi__pic_is4(stbi__context *s,const char *str) -{ - int i; - for (i=0; i<4; ++i) - if (stbi__get8(s) != (stbi_uc)str[i]) - return 0; - - return 1; -} - -static int stbi__pic_test_core(stbi__context *s) -{ - int i; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) - return 0; - - for(i=0;i<84;++i) - stbi__get8(s); - - if (!stbi__pic_is4(s,"PICT")) - return 0; - - return 1; -} - -typedef struct -{ - stbi_uc size,type,channel; -} stbi__pic_packet; - -static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) -{ - int mask=0x80, i; - - for (i=0; i<4; ++i, mask>>=1) { - if (channel & mask) { - if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); - dest[i]=stbi__get8(s); - } - } - - return dest; -} - -static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) -{ - int mask=0x80,i; - - for (i=0;i<4; ++i, mask>>=1) - if (channel&mask) - dest[i]=src[i]; -} - -static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) -{ - int act_comp=0,num_packets=0,y,chained; - stbi__pic_packet packets[10]; - - // this will (should...) cater for even some bizarre stuff like having data - // for the same channel in multiple packets. - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return stbi__errpuc("bad format","too many packets"); - - packet = &packets[num_packets++]; - - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - - act_comp |= packet->channel; - - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); - if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? - - for(y=0; ytype) { - default: - return stbi__errpuc("bad format","packet has bad compression type"); - - case 0: {//uncompressed - int x; - - for(x=0;xchannel,dest)) - return 0; - break; - } - - case 1://Pure RLE - { - int left=width, i; - - while (left>0) { - stbi_uc count,value[4]; - - count=stbi__get8(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); - - if (count > left) - count = (stbi_uc) left; - - if (!stbi__readval(s,packet->channel,value)) return 0; - - for(i=0; ichannel,dest,value); - left -= count; - } - } - break; - - case 2: {//Mixed RLE - int left=width; - while (left>0) { - int count = stbi__get8(s), i; - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); - - if (count >= 128) { // Repeated - stbi_uc value[4]; - - if (count==128) - count = stbi__get16be(s); - else - count -= 127; - if (count > left) - return stbi__errpuc("bad file","scanline overrun"); - - if (!stbi__readval(s,packet->channel,value)) - return 0; - - for(i=0;ichannel,dest,value); - } else { // Raw - ++count; - if (count>left) return stbi__errpuc("bad file","scanline overrun"); - - for(i=0;ichannel,dest)) - return 0; - } - left-=count; - } - break; - } - } - } - } - - return result; -} - -static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) -{ - stbi_uc *result; - int i, x,y, internal_comp; - STBI_NOTUSED(ri); - - if (!comp) comp = &internal_comp; - - for (i=0; i<92; ++i) - stbi__get8(s); - - x = stbi__get16be(s); - y = stbi__get16be(s); - if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); - if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); - - stbi__get32be(s); //skip `ratio' - stbi__get16be(s); //skip `fields' - stbi__get16be(s); //skip `pad' - - // intermediate buffer is RGBA - result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); - memset(result, 0xff, x*y*4); - - if (!stbi__pic_load_core(s,x,y,comp, result)) { - STBI_FREE(result); - result=0; - } - *px = x; - *py = y; - if (req_comp == 0) req_comp = *comp; - result=stbi__convert_format(result,4,req_comp,x,y); - - return result; -} - -static int stbi__pic_test(stbi__context *s) -{ - int r = stbi__pic_test_core(s); - stbi__rewind(s); - return r; -} -#endif - -// ************************************************************************************************* -// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb - -#ifndef STBI_NO_GIF -typedef struct -{ - stbi__int16 prefix; - stbi_uc first; - stbi_uc suffix; -} stbi__gif_lzw; - -typedef struct -{ - int w,h; - stbi_uc *out, *old_out; // output buffer (always 4 components) - int flags, bgindex, ratio, transparent, eflags, delay; - stbi_uc pal[256][4]; - stbi_uc lpal[256][4]; - stbi__gif_lzw codes[4096]; - stbi_uc *color_table; - int parse, step; - int lflags; - int start_x, start_y; - int max_x, max_y; - int cur_x, cur_y; - int line_size; -} stbi__gif; - -static int stbi__gif_test_raw(stbi__context *s) -{ - int sz; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; - sz = stbi__get8(s); - if (sz != '9' && sz != '7') return 0; - if (stbi__get8(s) != 'a') return 0; - return 1; -} - -static int stbi__gif_test(stbi__context *s) -{ - int r = stbi__gif_test_raw(s); - stbi__rewind(s); - return r; -} - -static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) -{ - int i; - for (i=0; i < num_entries; ++i) { - pal[i][2] = stbi__get8(s); - pal[i][1] = stbi__get8(s); - pal[i][0] = stbi__get8(s); - pal[i][3] = transp == i ? 0 : 255; - } -} - -static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) -{ - stbi_uc version; - if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') - return stbi__err("not GIF", "Corrupt GIF"); - - version = stbi__get8(s); - if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); - if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); - - stbi__g_failure_reason = ""; - g->w = stbi__get16le(s); - g->h = stbi__get16le(s); - g->flags = stbi__get8(s); - g->bgindex = stbi__get8(s); - g->ratio = stbi__get8(s); - g->transparent = -1; - - if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments - - if (is_info) return 1; - - if (g->flags & 0x80) - stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); - - return 1; -} - -static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) -{ - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - if (!stbi__gif_header(s, g, comp, 1)) { - STBI_FREE(g); - stbi__rewind( s ); - return 0; - } - if (x) *x = g->w; - if (y) *y = g->h; - STBI_FREE(g); - return 1; -} - -static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) -{ - stbi_uc *p, *c; - - // recurse to decode the prefixes, since the linked-list is backwards, - // and working backwards through an interleaved image would be nasty - if (g->codes[code].prefix >= 0) - stbi__out_gif_code(g, g->codes[code].prefix); - - if (g->cur_y >= g->max_y) return; - - p = &g->out[g->cur_x + g->cur_y]; - c = &g->color_table[g->codes[code].suffix * 4]; - - if (c[3] >= 128) { - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = c[3]; - } - g->cur_x += 4; - - if (g->cur_x >= g->max_x) { - g->cur_x = g->start_x; - g->cur_y += g->step; - - while (g->cur_y >= g->max_y && g->parse > 0) { - g->step = (1 << g->parse) * g->line_size; - g->cur_y = g->start_y + (g->step >> 1); - --g->parse; - } - } -} - -static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) -{ - stbi_uc lzw_cs; - stbi__int32 len, init_code; - stbi__uint32 first; - stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; - stbi__gif_lzw *p; - - lzw_cs = stbi__get8(s); - if (lzw_cs > 12) return NULL; - clear = 1 << lzw_cs; - first = 1; - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - bits = 0; - valid_bits = 0; - for (init_code = 0; init_code < clear; init_code++) { - g->codes[init_code].prefix = -1; - g->codes[init_code].first = (stbi_uc) init_code; - g->codes[init_code].suffix = (stbi_uc) init_code; - } - - // support no starting clear code - avail = clear+2; - oldcode = -1; - - len = 0; - for(;;) { - if (valid_bits < codesize) { - if (len == 0) { - len = stbi__get8(s); // start new block - if (len == 0) - return g->out; - } - --len; - bits |= (stbi__int32) stbi__get8(s) << valid_bits; - valid_bits += 8; - } else { - stbi__int32 code = bits & codemask; - bits >>= codesize; - valid_bits -= codesize; - // @OPTIMIZE: is there some way we can accelerate the non-clear path? - if (code == clear) { // clear code - codesize = lzw_cs + 1; - codemask = (1 << codesize) - 1; - avail = clear + 2; - oldcode = -1; - first = 0; - } else if (code == clear + 1) { // end of stream code - stbi__skip(s, len); - while ((len = stbi__get8(s)) > 0) - stbi__skip(s,len); - return g->out; - } else if (code <= avail) { - if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); - - if (oldcode >= 0) { - p = &g->codes[avail++]; - if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); - p->prefix = (stbi__int16) oldcode; - p->first = g->codes[oldcode].first; - p->suffix = (code == avail) ? p->first : g->codes[code].first; - } else if (code == avail) - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - - stbi__out_gif_code(g, (stbi__uint16) code); - - if ((avail & codemask) == 0 && avail <= 0x0FFF) { - codesize++; - codemask = (1 << codesize) - 1; - } - - oldcode = code; - } else { - return stbi__errpuc("illegal code in raster", "Corrupt GIF"); - } - } - } -} - -static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1) -{ - int x, y; - stbi_uc *c = g->pal[g->bgindex]; - for (y = y0; y < y1; y += 4 * g->w) { - for (x = x0; x < x1; x += 4) { - stbi_uc *p = &g->out[y + x]; - p[0] = c[2]; - p[1] = c[1]; - p[2] = c[0]; - p[3] = 0; - } - } -} - -// this function is designed to support animated gifs, although stb_image doesn't support it -static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) -{ - int i; - stbi_uc *prev_out = 0; - - if (g->out == 0 && !stbi__gif_header(s, g, comp,0)) - return 0; // stbi__g_failure_reason set by stbi__gif_header - - if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0)) - return stbi__errpuc("too large", "GIF too large"); - - prev_out = g->out; - g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0); - if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); - - switch ((g->eflags & 0x1C) >> 2) { - case 0: // unspecified (also always used on 1st frame) - stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h); - break; - case 1: // do not dispose - if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); - g->old_out = prev_out; - break; - case 2: // dispose to background - if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); - stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y); - break; - case 3: // dispose to previous - if (g->old_out) { - for (i = g->start_y; i < g->max_y; i += 4 * g->w) - memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x); - } - break; - } - - for (;;) { - switch (stbi__get8(s)) { - case 0x2C: /* Image Descriptor */ - { - int prev_trans = -1; - stbi__int32 x, y, w, h; - stbi_uc *o; - - x = stbi__get16le(s); - y = stbi__get16le(s); - w = stbi__get16le(s); - h = stbi__get16le(s); - if (((x + w) > (g->w)) || ((y + h) > (g->h))) - return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); - - g->line_size = g->w * 4; - g->start_x = x * 4; - g->start_y = y * g->line_size; - g->max_x = g->start_x + w * 4; - g->max_y = g->start_y + h * g->line_size; - g->cur_x = g->start_x; - g->cur_y = g->start_y; - - g->lflags = stbi__get8(s); - - if (g->lflags & 0x40) { - g->step = 8 * g->line_size; // first interlaced spacing - g->parse = 3; - } else { - g->step = g->line_size; - g->parse = 0; - } - - if (g->lflags & 0x80) { - stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); - g->color_table = (stbi_uc *) g->lpal; - } else if (g->flags & 0x80) { - if (g->transparent >= 0 && (g->eflags & 0x01)) { - prev_trans = g->pal[g->transparent][3]; - g->pal[g->transparent][3] = 0; - } - g->color_table = (stbi_uc *) g->pal; - } else - return stbi__errpuc("missing color table", "Corrupt GIF"); - - o = stbi__process_gif_raster(s, g); - if (o == NULL) return NULL; - - if (prev_trans != -1) - g->pal[g->transparent][3] = (stbi_uc) prev_trans; - - return o; - } - - case 0x21: // Comment Extension. - { - int len; - if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. - len = stbi__get8(s); - if (len == 4) { - g->eflags = stbi__get8(s); - g->delay = stbi__get16le(s); - g->transparent = stbi__get8(s); - } else { - stbi__skip(s, len); - break; - } - } - while ((len = stbi__get8(s)) != 0) - stbi__skip(s, len); - break; - } - - case 0x3B: // gif stream termination code - return (stbi_uc *) s; // using '1' causes warning on some compilers - - default: - return stbi__errpuc("unknown code", "Corrupt GIF"); - } - } - - STBI_NOTUSED(req_comp); -} - -static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *u = 0; - stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); - memset(g, 0, sizeof(*g)); - STBI_NOTUSED(ri); - - u = stbi__gif_load_next(s, g, comp, req_comp); - if (u == (stbi_uc *) s) u = 0; // end of animated gif marker - if (u) { - *x = g->w; - *y = g->h; - if (req_comp && req_comp != 4) - u = stbi__convert_format(u, 4, req_comp, g->w, g->h); - } - else if (g->out) - STBI_FREE(g->out); - STBI_FREE(g); - return u; -} - -static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) -{ - return stbi__gif_info_raw(s,x,y,comp); -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR loader -// originally by Nicolas Schulz -#ifndef STBI_NO_HDR -static int stbi__hdr_test_core(stbi__context *s, const char *signature) -{ - int i; - for (i=0; signature[i]; ++i) - if (stbi__get8(s) != signature[i]) - return 0; - stbi__rewind(s); - return 1; -} - -static int stbi__hdr_test(stbi__context* s) -{ - int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); - stbi__rewind(s); - if(!r) { - r = stbi__hdr_test_core(s, "#?RGBE\n"); - stbi__rewind(s); - } - return r; -} - -#define STBI__HDR_BUFLEN 1024 -static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) -{ - int len=0; - char c = '\0'; - - c = (char) stbi__get8(z); - - while (!stbi__at_eof(z) && c != '\n') { - buffer[len++] = c; - if (len == STBI__HDR_BUFLEN-1) { - // flush to end of line - while (!stbi__at_eof(z) && stbi__get8(z) != '\n') - ; - break; - } - c = (char) stbi__get8(z); - } - - buffer[len] = 0; - return buffer; -} - -static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) -{ - if ( input[3] != 0 ) { - float f1; - // Exponent - f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); - if (req_comp <= 2) - output[0] = (input[0] + input[1] + input[2]) * f1 / 3; - else { - output[0] = input[0] * f1; - output[1] = input[1] * f1; - output[2] = input[2] * f1; - } - if (req_comp == 2) output[1] = 1; - if (req_comp == 4) output[3] = 1; - } else { - switch (req_comp) { - case 4: output[3] = 1; /* fallthrough */ - case 3: output[0] = output[1] = output[2] = 0; - break; - case 2: output[1] = 1; /* fallthrough */ - case 1: output[0] = 0; - break; - } - } -} - -static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int width, height; - stbi_uc *scanline; - float *hdr_data; - int len; - unsigned char count, value; - int i, j, k, c1,c2, z; - const char *headerToken; - STBI_NOTUSED(ri); - - // Check identifier - headerToken = stbi__hdr_gettoken(s,buffer); - if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) - return stbi__errpf("not HDR", "Corrupt HDR image"); - - // Parse header - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); - - // Parse width and height - // can't use sscanf() if we're not using stdio! - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - height = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); - token += 3; - width = (int) strtol(token, NULL, 10); - - *x = width; - *y = height; - - if (comp) *comp = 3; - if (req_comp == 0) req_comp = 3; - - if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) - return stbi__errpf("too large", "HDR image is too large"); - - // Read data - hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); - if (!hdr_data) - return stbi__errpf("outofmem", "Out of memory"); - - // Load image data - // image data is stored as some number of sca - if ( width < 8 || width >= 32768) { - // Read flat data - for (j=0; j < height; ++j) { - for (i=0; i < width; ++i) { - stbi_uc rgbe[4]; - main_decode_loop: - stbi__getn(s, rgbe, 4); - stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); - } - } - } else { - // Read RLE-encoded data - scanline = NULL; - - for (j = 0; j < height; ++j) { - c1 = stbi__get8(s); - c2 = stbi__get8(s); - len = stbi__get8(s); - if (c1 != 2 || c2 != 2 || (len & 0x80)) { - // not run-length encoded, so we have to actually use THIS data as a decoded - // pixel (note this can't be a valid pixel--one of RGB must be >= 128) - stbi_uc rgbe[4]; - rgbe[0] = (stbi_uc) c1; - rgbe[1] = (stbi_uc) c2; - rgbe[2] = (stbi_uc) len; - rgbe[3] = (stbi_uc) stbi__get8(s); - stbi__hdr_convert(hdr_data, rgbe, req_comp); - i = 1; - j = 0; - STBI_FREE(scanline); - goto main_decode_loop; // yes, this makes no sense - } - len <<= 8; - len |= stbi__get8(s); - if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } - if (scanline == NULL) { - scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); - if (!scanline) { - STBI_FREE(hdr_data); - return stbi__errpf("outofmem", "Out of memory"); - } - } - - for (k = 0; k < 4; ++k) { - int nleft; - i = 0; - while ((nleft = width - i) > 0) { - count = stbi__get8(s); - if (count > 128) { - // Run - value = stbi__get8(s); - count -= 128; - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = value; - } else { - // Dump - if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } - for (z = 0; z < count; ++z) - scanline[i++ * 4 + k] = stbi__get8(s); - } - } - } - for (i=0; i < width; ++i) - stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); - } - if (scanline) - STBI_FREE(scanline); - } - - return hdr_data; -} - -static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) -{ - char buffer[STBI__HDR_BUFLEN]; - char *token; - int valid = 0; - int dummy; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (stbi__hdr_test(s) == 0) { - stbi__rewind( s ); - return 0; - } - - for(;;) { - token = stbi__hdr_gettoken(s,buffer); - if (token[0] == 0) break; - if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; - } - - if (!valid) { - stbi__rewind( s ); - return 0; - } - token = stbi__hdr_gettoken(s,buffer); - if (strncmp(token, "-Y ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *y = (int) strtol(token, &token, 10); - while (*token == ' ') ++token; - if (strncmp(token, "+X ", 3)) { - stbi__rewind( s ); - return 0; - } - token += 3; - *x = (int) strtol(token, NULL, 10); - *comp = 3; - return 1; -} -#endif // STBI_NO_HDR - -#ifndef STBI_NO_BMP -static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) -{ - void *p; - stbi__bmp_data info; - - info.all_a = 255; - p = stbi__bmp_parse_header(s, &info); - stbi__rewind( s ); - if (p == NULL) - return 0; - if (x) *x = s->img_x; - if (y) *y = s->img_y; - if (comp) *comp = info.ma ? 4 : 3; - return 1; -} -#endif - -#ifndef STBI_NO_PSD -static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) -{ - int channelCount, dummy; - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - if (stbi__get32be(s) != 0x38425053) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 1) { - stbi__rewind( s ); - return 0; - } - stbi__skip(s, 6); - channelCount = stbi__get16be(s); - if (channelCount < 0 || channelCount > 16) { - stbi__rewind( s ); - return 0; - } - *y = stbi__get32be(s); - *x = stbi__get32be(s); - if (stbi__get16be(s) != 8) { - stbi__rewind( s ); - return 0; - } - if (stbi__get16be(s) != 3) { - stbi__rewind( s ); - return 0; - } - *comp = 4; - return 1; -} -#endif - -#ifndef STBI_NO_PIC -static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) -{ - int act_comp=0,num_packets=0,chained,dummy; - stbi__pic_packet packets[10]; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { - stbi__rewind(s); - return 0; - } - - stbi__skip(s, 88); - - *x = stbi__get16be(s); - *y = stbi__get16be(s); - if (stbi__at_eof(s)) { - stbi__rewind( s); - return 0; - } - if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { - stbi__rewind( s ); - return 0; - } - - stbi__skip(s, 8); - - do { - stbi__pic_packet *packet; - - if (num_packets==sizeof(packets)/sizeof(packets[0])) - return 0; - - packet = &packets[num_packets++]; - chained = stbi__get8(s); - packet->size = stbi__get8(s); - packet->type = stbi__get8(s); - packet->channel = stbi__get8(s); - act_comp |= packet->channel; - - if (stbi__at_eof(s)) { - stbi__rewind( s ); - return 0; - } - if (packet->size != 8) { - stbi__rewind( s ); - return 0; - } - } while (chained); - - *comp = (act_comp & 0x10 ? 4 : 3); - - return 1; -} -#endif - -// ************************************************************************************************* -// Portable Gray Map and Portable Pixel Map loader -// by Ken Miller -// -// PGM: http://netpbm.sourceforge.net/doc/pgm.html -// PPM: http://netpbm.sourceforge.net/doc/ppm.html -// -// Known limitations: -// Does not support comments in the header section -// Does not support ASCII image data (formats P2 and P3) -// Does not support 16-bit-per-channel - -#ifndef STBI_NO_PNM - -static int stbi__pnm_test(stbi__context *s) -{ - char p, t; - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind( s ); - return 0; - } - return 1; -} - -static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) -{ - stbi_uc *out; - STBI_NOTUSED(ri); - - if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) - return 0; - - *x = s->img_x; - *y = s->img_y; - if (comp) *comp = s->img_n; - - if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - stbi__getn(s, out, s->img_n * s->img_x * s->img_y); - - if (req_comp && req_comp != s->img_n) { - out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); - if (out == NULL) return out; // stbi__convert_format frees input on failure - } - return out; -} - -static int stbi__pnm_isspace(char c) -{ - return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; -} - -static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) -{ - for (;;) { - while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) - *c = (char) stbi__get8(s); - - if (stbi__at_eof(s) || *c != '#') - break; - - while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) - *c = (char) stbi__get8(s); - } -} - -static int stbi__pnm_isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int stbi__pnm_getinteger(stbi__context *s, char *c) -{ - int value = 0; - - while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { - value = value*10 + (*c - '0'); - *c = (char) stbi__get8(s); - } - - return value; -} - -static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) -{ - int maxv, dummy; - char c, p, t; - - if (!x) x = &dummy; - if (!y) y = &dummy; - if (!comp) comp = &dummy; - - stbi__rewind(s); - - // Get identifier - p = (char) stbi__get8(s); - t = (char) stbi__get8(s); - if (p != 'P' || (t != '5' && t != '6')) { - stbi__rewind(s); - return 0; - } - - *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm - - c = (char) stbi__get8(s); - stbi__pnm_skip_whitespace(s, &c); - - *x = stbi__pnm_getinteger(s, &c); // read width - stbi__pnm_skip_whitespace(s, &c); - - *y = stbi__pnm_getinteger(s, &c); // read height - stbi__pnm_skip_whitespace(s, &c); - - maxv = stbi__pnm_getinteger(s, &c); // read max value - - if (maxv > 255) - return stbi__err("max value > 255", "PPM image not 8-bit"); - else - return 1; -} -#endif - -static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) -{ - #ifndef STBI_NO_JPEG - if (stbi__jpeg_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNG - if (stbi__png_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_GIF - if (stbi__gif_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_BMP - if (stbi__bmp_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PSD - if (stbi__psd_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PIC - if (stbi__pic_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_PNM - if (stbi__pnm_info(s, x, y, comp)) return 1; - #endif - - #ifndef STBI_NO_HDR - if (stbi__hdr_info(s, x, y, comp)) return 1; - #endif - - // test tga last because it's a crappy test! - #ifndef STBI_NO_TGA - if (stbi__tga_info(s, x, y, comp)) - return 1; - #endif - return stbi__err("unknown image type", "Image not of any known type, or corrupt"); -} - -#ifndef STBI_NO_STDIO -STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) -{ - FILE *f = stbi__fopen(filename, "rb"); - int result; - if (!f) return stbi__err("can't fopen", "Unable to open file"); - result = stbi_info_from_file(f, x, y, comp); - fclose(f); - return result; -} - -STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) -{ - int r; - stbi__context s; - long pos = ftell(f); - stbi__start_file(&s, f); - r = stbi__info_main(&s,x,y,comp); - fseek(f,pos,SEEK_SET); - return r; -} -#endif // !STBI_NO_STDIO - -STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_mem(&s,buffer,len); - return stbi__info_main(&s,x,y,comp); -} - -STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) -{ - stbi__context s; - stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); - return stbi__info_main(&s,x,y,comp); -} - -#endif // STB_IMAGE_IMPLEMENTATION - -/* - revision history: - 2.16 (2017-07-23) all functions have 16-bit variants; - STBI_NO_STDIO works again; - compilation fixes; - fix rounding in unpremultiply; - optimize vertical flip; - disable raw_len validation; - documentation fixes - 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; - warning fixes; disable run-time SSE detection on gcc; - uniform handling of optional "return" values; - thread-safe initialization of zlib tables - 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs - 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now - 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes - 2.11 (2016-04-02) allocate large structures on the stack - remove white matting for transparent PSD - fix reported channel count for PNG & BMP - re-enable SSE2 in non-gcc 64-bit - support RGB-formatted JPEG - read 16-bit PNGs (only as 8-bit) - 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED - 2.09 (2016-01-16) allow comments in PNM files - 16-bit-per-pixel TGA (not bit-per-component) - info() for TGA could break due to .hdr handling - info() for BMP to shares code instead of sloppy parse - can use STBI_REALLOC_SIZED if allocator doesn't support realloc - code cleanup - 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA - 2.07 (2015-09-13) fix compiler warnings - partial animated GIF support - limited 16-bpc PSD support - #ifdef unused functions - bug with < 92 byte PIC,PNM,HDR,TGA - 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value - 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning - 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit - 2.03 (2015-04-12) extra corruption checking (mmozeiko) - stbi_set_flip_vertically_on_load (nguillemot) - fix NEON support; fix mingw support - 2.02 (2015-01-19) fix incorrect assert, fix warning - 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 - 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG - 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) - progressive JPEG (stb) - PGM/PPM support (Ken Miller) - STBI_MALLOC,STBI_REALLOC,STBI_FREE - GIF bugfix -- seemingly never worked - STBI_NO_*, STBI_ONLY_* - 1.48 (2014-12-14) fix incorrectly-named assert() - 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) - optimize PNG (ryg) - fix bug in interlaced PNG with user-specified channel count (stb) - 1.46 (2014-08-26) - fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG - 1.45 (2014-08-16) - fix MSVC-ARM internal compiler error by wrapping malloc - 1.44 (2014-08-07) - various warning fixes from Ronny Chevalier - 1.43 (2014-07-15) - fix MSVC-only compiler problem in code changed in 1.42 - 1.42 (2014-07-09) - don't define _CRT_SECURE_NO_WARNINGS (affects user code) - fixes to stbi__cleanup_jpeg path - added STBI_ASSERT to avoid requiring assert.h - 1.41 (2014-06-25) - fix search&replace from 1.36 that messed up comments/error messages - 1.40 (2014-06-22) - fix gcc struct-initialization warning - 1.39 (2014-06-15) - fix to TGA optimization when req_comp != number of components in TGA; - fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) - add support for BMP version 5 (more ignored fields) - 1.38 (2014-06-06) - suppress MSVC warnings on integer casts truncating values - fix accidental rename of 'skip' field of I/O - 1.37 (2014-06-04) - remove duplicate typedef - 1.36 (2014-06-03) - convert to header file single-file library - if de-iphone isn't set, load iphone images color-swapped instead of returning NULL - 1.35 (2014-05-27) - various warnings - fix broken STBI_SIMD path - fix bug where stbi_load_from_file no longer left file pointer in correct place - fix broken non-easy path for 32-bit BMP (possibly never used) - TGA optimization by Arseny Kapoulkine - 1.34 (unknown) - use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case - 1.33 (2011-07-14) - make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements - 1.32 (2011-07-13) - support for "info" function for all supported filetypes (SpartanJ) - 1.31 (2011-06-20) - a few more leak fixes, bug in PNG handling (SpartanJ) - 1.30 (2011-06-11) - added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) - removed deprecated format-specific test/load functions - removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway - error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) - fix inefficiency in decoding 32-bit BMP (David Woo) - 1.29 (2010-08-16) - various warning fixes from Aurelien Pocheville - 1.28 (2010-08-01) - fix bug in GIF palette transparency (SpartanJ) - 1.27 (2010-08-01) - cast-to-stbi_uc to fix warnings - 1.26 (2010-07-24) - fix bug in file buffering for PNG reported by SpartanJ - 1.25 (2010-07-17) - refix trans_data warning (Won Chun) - 1.24 (2010-07-12) - perf improvements reading from files on platforms with lock-heavy fgetc() - minor perf improvements for jpeg - deprecated type-specific functions so we'll get feedback if they're needed - attempt to fix trans_data warning (Won Chun) - 1.23 fixed bug in iPhone support - 1.22 (2010-07-10) - removed image *writing* support - stbi_info support from Jetro Lauha - GIF support from Jean-Marc Lienher - iPhone PNG-extensions from James Brown - warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) - 1.21 fix use of 'stbi_uc' in header (reported by jon blow) - 1.20 added support for Softimage PIC, by Tom Seddon - 1.19 bug in interlaced PNG corruption check (found by ryg) - 1.18 (2008-08-02) - fix a threading bug (local mutable static) - 1.17 support interlaced PNG - 1.16 major bugfix - stbi__convert_format converted one too many pixels - 1.15 initialize some fields for thread safety - 1.14 fix threadsafe conversion bug - header-file-only version (#define STBI_HEADER_FILE_ONLY before including) - 1.13 threadsafe - 1.12 const qualifiers in the API - 1.11 Support installable IDCT, colorspace conversion routines - 1.10 Fixes for 64-bit (don't use "unsigned long") - optimized upsampling by Fabian "ryg" Giesen - 1.09 Fix format-conversion for PSD code (bad global variables!) - 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz - 1.07 attempt to fix C++ warning/errors again - 1.06 attempt to fix C++ warning/errors again - 1.05 fix TGA loading to return correct *comp and use good luminance calc - 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free - 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR - 1.02 support for (subset of) HDR files, float interface for preferred access to them - 1.01 fix bug: possible bug in handling right-side up bmps... not sure - fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all - 1.00 interface to zlib that skips zlib header - 0.99 correct handling of alpha in palette - 0.98 TGA loader by lonesock; dynamically add loaders (untested) - 0.97 jpeg errors on too large a file; also catch another malloc failure - 0.96 fix detection of invalid v value - particleman@mollyrocket forum - 0.95 during header scan, seek to markers in case of padding - 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same - 0.93 handle jpegtran output; verbose errors - 0.92 read 4,8,16,24,32-bit BMP files of several formats - 0.91 output 24-bit Windows 3.0 BMP files - 0.90 fix a few more warnings; bump version number to approach 1.0 - 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd - 0.60 fix compiling as c++ - 0.59 fix warnings: merge Dave Moore's -Wall fixes - 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian - 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available - 0.56 fix bug: zlib uncompressed mode len vs. nlen - 0.55 fix bug: restart_interval not initialized to 0 - 0.54 allow NULL for 'int *comp' - 0.53 fix bug in png 3->4; speedup png decoding - 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments - 0.51 obey req_comp requests, 1-component jpegs return as 1-component, - on 'test' only check type, not whether we support this variant - 0.50 (2006-11-19) - first released version -*/ - - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ +/* stb_image - v2.26 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + 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 (*comp 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: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko [reserved] + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=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) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *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 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *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=#comp 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 NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// 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). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// 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--see header +// file for details) 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: +// +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_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). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_LINEAR + +// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// on most compilers (and ALL modern mainstream compilers) this is threadsafe +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// 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 overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) + #ifndef STBI_ONLY_JPEG + #define STBI_NO_JPEG + #endif + #ifndef STBI_ONLY_PNG + #define STBI_NO_PNG + #endif + #ifndef STBI_ONLY_BMP + #define STBI_NO_BMP + #endif + #ifndef STBI_ONLY_PSD + #define STBI_NO_PSD + #endif + #ifndef STBI_ONLY_TGA + #define STBI_NO_TGA + #endif + #ifndef STBI_ONLY_GIF + #define STBI_NO_GIF + #endif + #ifndef STBI_ONLY_HDR + #define STBI_NO_HDR + #endif + #ifndef STBI_ONLY_PIC + #define STBI_NO_PIC + #endif + #ifndef STBI_ONLY_PNM + #define STBI_NO_PNM + #endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + int callback_already_read; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->callback_already_read = 0; + s->img_buffer = s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((FILE *) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test(stbi__context *s); +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test(stbi__context *s); +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s); +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test(stbi__context *s); +static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test(stbi__context *s); +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test(stbi__context *s); +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static int stbi__vertically_flip_on_load_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) + return 0; + +#if _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + } + if (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/255.0f; + } + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (~0U << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + if (n < 0 || n >= (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))) return 0; + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + if (t == -1) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0]*4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 65); + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++z->rgb; + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (is_rgb) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s >= 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + if (b >= sizeof (z->size)) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) { + if (stbi__zeof(a)) { + return -1; /* report error for unexpected end of data. */ + } + stbi__fill_bits(a); + } + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + limit *= 2; + } + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + int ntot = hlit + hdist; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < ntot) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG"); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]={0}; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) { n += 16; z >>= 16; } + if (z >= 0x00100) { n += 8; z >>= 8; } + if (z >= 0x00010) { n += 4; z >>= 4; } + if (z >= 0x00004) { n += 2; z >>= 2; } + if (z >= 0x00002) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED(ri); + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + STBI_ASSERT(info.offset == s->callback_already_read + (int) (s->img_buffer - s->img_buffer_original)); + if (info.offset != s->callback_already_read + (s->img_buffer - s->buffer_start)) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - info.extra_read - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + unsigned int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if (is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((b * 255)/31); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED(tga_palette_start); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + out = (stbi_uc *) stbi__malloc(4 * w*h); + + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) { + return stbi__errpuc("no clear code", "Corrupt GIF"); + } + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 8192) { + return stbi__errpuc("too many codes", "Corrupt GIF"); + } + + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (!o) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) { + stbi__skip(s, len); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (NULL == tmp) { + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + return stbi__errpuc("outofmem", "Out of memory"); + } + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + *delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s, const char *signature) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + stbi__rewind(s); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) { + scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + if (scanline) + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + (void) stbi__get32be(s); + (void) stbi__get32be(s); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + stbi__rewind(s); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind(s); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNG + if (stbi__png_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_GIF + if (stbi__gif_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_BMP + if (stbi__bmp_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PIC + if (stbi__pic_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_info(s, x, y, comp)) return 1; + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) return 1; + #endif + + // test tga last because it's a crappy test! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/extern/sfml/extlibs/headers/stb_image/stb_image_write.h b/extern/sfml/extlibs/headers/stb_image/stb_image_write.h index 9d553e0..c6d3d55 100644 --- a/extern/sfml/extlibs/headers/stb_image/stb_image_write.h +++ b/extern/sfml/extlibs/headers/stb_image/stb_image_write.h @@ -1,1458 +1,1690 @@ -/* stb_image_write - v1.07 - public domain - http://nothings.org/stb/stb_image_write.h - writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 - no warranty implied; use at your own risk - - Before #including, - - #define STB_IMAGE_WRITE_IMPLEMENTATION - - in the file that you want to have the implementation. - - Will probably not work correctly with strict-aliasing optimizations. - -ABOUT: - - This header file is a library for writing images to C stdio. It could be - adapted to write to memory or a general streaming interface; let me know. - - The PNG output is not optimal; it is 20-50% larger than the file - written by a decent optimizing implementation. This library is designed - for source code compactness and simplicity, not optimal image file size - or run-time performance. - -BUILDING: - - You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. - You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace - malloc,realloc,free. - You can define STBIW_MEMMOVE() to replace memmove() - -USAGE: - - There are four 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 float *data); - int stbi_write_jpg(char const *filename, int w, int h, int comp, const float *data); - - There are also four 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 define STBI_WRITE_NO_STDIO to disable the file variant of these - functions, so the library will not use stdio.h at all. However, this will - also disable HDR writing, because it requires stdio for formatted output. - - Each function returns 0 on failure and non-0 on success. - - 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 '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 'w' pixels wide and 'h' pixels tall. - The *data pointer points to the first byte of the top-left-most pixel. - For PNG, "stride_in_bytes" is the distance in bytes from the first byte of - a row of pixels to the first byte of the next row of pixels. - - PNG creates output files with the same number of components as the input. - The BMP format expands Y to RGB in the file format and does not - output alpha. - - 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.) - - 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. - - TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed - data, set the global variable 'stbi_write_tga_with_rle' to 0. - - 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). - -CREDITS: - - PNG/BMP/TGA - Sean Barrett - HDR - Baldur Karlsson - TGA monochrome: - Jean-Sebastien Guay - misc enhancements: - Tim Kelsey - TGA RLE - Alan Hickman - initial file IO callback implementation - Emmanuel Julien - JPEG - Jon Olick (original jo_jpeg.cpp code) - Daniel Gibson - bugfixes: - github:Chribba - Guillaume Chereau - github:jry2 - github:romigrou - Sergio Gonzalez - Jonas Karlsson - Filip Wasil - Thatcher Ulrich - github:poppolopoppo - Patrick Boettcher - -LICENSE - - See end of file for license information. - -*/ - -#ifndef INCLUDE_STB_IMAGE_WRITE_H -#define INCLUDE_STB_IMAGE_WRITE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef STB_IMAGE_WRITE_STATIC -#define STBIWDEF static -#else -#define STBIWDEF extern -extern int stbi_write_tga_with_rle; -#endif - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); -STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); -#endif - -typedef void stbi_write_func(void *context, void *data, int size); - -STBIWDEF 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); -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); - -#ifdef __cplusplus -} -#endif - -#endif//INCLUDE_STB_IMAGE_WRITE_H - -#ifdef STB_IMAGE_WRITE_IMPLEMENTATION - -#ifdef _WIN32 - #ifndef _CRT_SECURE_NO_WARNINGS - #define _CRT_SECURE_NO_WARNINGS - #endif - #ifndef _CRT_NONSTDC_NO_DEPRECATE - #define _CRT_NONSTDC_NO_DEPRECATE - #endif -#endif - -#ifndef STBI_WRITE_NO_STDIO -#include -#endif // STBI_WRITE_NO_STDIO - -#include -#include -#include -#include - -#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) -// ok -#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) -// ok -#else -#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." -#endif - -#ifndef STBIW_MALLOC -#define STBIW_MALLOC(sz) malloc(sz) -#define STBIW_REALLOC(p,newsz) realloc(p,newsz) -#define STBIW_FREE(p) free(p) -#endif - -#ifndef STBIW_REALLOC_SIZED -#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) -#endif - - -#ifndef STBIW_MEMMOVE -#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) -#endif - - -#ifndef STBIW_ASSERT -#include -#define STBIW_ASSERT(x) assert(x) -#endif - -#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) - -typedef struct -{ - stbi_write_func *func; - void *context; -} stbi__write_context; - -// initialize a callback-based context -static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) -{ - s->func = c; - s->context = context; -} - -#ifndef STBI_WRITE_NO_STDIO - -static void stbi__stdio_write(void *context, void *data, int size) -{ - fwrite(data,1,size,(FILE*) context); -} - -static int stbi__start_write_file(stbi__write_context *s, const char *filename) -{ - FILE *f = fopen(filename, "wb"); - stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); - return f != NULL; -} - -static void stbi__end_write_file(stbi__write_context *s) -{ - fclose((FILE *)s->context); -} - -#endif // !STBI_WRITE_NO_STDIO - -typedef unsigned int stbiw_uint32; -typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; - -#ifdef STB_IMAGE_WRITE_STATIC -static int stbi_write_tga_with_rle = 1; -#else -int stbi_write_tga_with_rle = 1; -#endif - -static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) -{ - while (*fmt) { - switch (*fmt++) { - case ' ': break; - case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); - s->func(s->context,&x,1); - break; } - case '2': { int x = va_arg(v,int); - unsigned char b[2]; - b[0] = STBIW_UCHAR(x); - b[1] = STBIW_UCHAR(x>>8); - s->func(s->context,b,2); - break; } - case '4': { stbiw_uint32 x = va_arg(v,int); - unsigned char b[4]; - b[0]=STBIW_UCHAR(x); - b[1]=STBIW_UCHAR(x>>8); - b[2]=STBIW_UCHAR(x>>16); - b[3]=STBIW_UCHAR(x>>24); - s->func(s->context,b,4); - break; } - default: - STBIW_ASSERT(0); - return; - } - } -} - -static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) -{ - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); -} - -static void stbiw__putc(stbi__write_context *s, unsigned char c) -{ - s->func(s->context, &c, 1); -} - -static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) -{ - unsigned char arr[3]; - arr[0] = a, arr[1] = b, arr[2] = c; - s->func(s->context, arr, 3); -} - -static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) -{ - unsigned char bg[3] = { 255, 0, 255}, px[3]; - int k; - - if (write_alpha < 0) - s->func(s->context, &d[comp - 1], 1); - - switch (comp) { - case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case - case 1: - if (expand_mono) - stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp - else - s->func(s->context, d, 1); // monochrome TGA - break; - case 4: - if (!write_alpha) { - // composite against pink background - for (k = 0; k < 3; ++k) - px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; - stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); - break; - } - /* FALLTHROUGH */ - case 3: - stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); - break; - } - if (write_alpha > 0) - s->func(s->context, &d[comp - 1], 1); -} - -static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) -{ - stbiw_uint32 zero = 0; - int i,j, j_end; - - if (y <= 0) - return; - - if (vdir < 0) - j_end = -1, j = y-1; - else - j_end = y, j = 0; - - for (; j != j_end; j += vdir) { - for (i=0; i < x; ++i) { - unsigned char *d = (unsigned char *) data + (j*x+i)*comp; - stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); - } - s->func(s->context, &zero, scanline_pad); - } -} - -static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) -{ - if (y < 0 || x < 0) { - return 0; - } else { - va_list v; - va_start(v, fmt); - stbiw__writefv(s, fmt, v); - va_end(v); - stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); - return 1; - } -} - -static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) -{ - int pad = (-x*3) & 3; - return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, - "11 4 22 4" "4 44 22 444444", - 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header - 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header -} - -STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_bmp_core(&s, x, y, comp, data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_bmp_core(&s, x, y, comp, data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif //!STBI_WRITE_NO_STDIO - -static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) -{ - int has_alpha = (comp == 2 || comp == 4); - int colorbytes = has_alpha ? comp-1 : comp; - int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 - - if (y < 0 || x < 0) - return 0; - - if (!stbi_write_tga_with_rle) { - return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, - "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); - } else { - int i,j,k; - - stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); - - for (j = y - 1; j >= 0; --j) { - unsigned char *row = (unsigned char *) data + j * x * comp; - int len; - - for (i = 0; i < x; i += len) { - unsigned char *begin = row + i * comp; - int diff = 1; - len = 1; - - if (i < x - 1) { - ++len; - diff = memcmp(begin, row + (i + 1) * comp, comp); - if (diff) { - const unsigned char *prev = begin; - for (k = i + 2; k < x && len < 128; ++k) { - if (memcmp(prev, row + k * comp, comp)) { - prev += comp; - ++len; - } else { - --len; - break; - } - } - } else { - for (k = i + 2; k < x && len < 128; ++k) { - if (!memcmp(begin, row + k * comp, comp)) { - ++len; - } else { - break; - } - } - } - } - - if (diff) { - unsigned char header = STBIW_UCHAR(len - 1); - s->func(s->context, &header, 1); - for (k = 0; k < len; ++k) { - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); - } - } else { - unsigned char header = STBIW_UCHAR(len - 129); - s->func(s->context, &header, 1); - stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); - } - } - } - } - return 1; -} - -STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_tga_core(&s, x, y, comp, (void *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -// ************************************************************************************************* -// Radiance RGBE HDR writer -// by Baldur Karlsson - -#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) - -void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) -{ - int exponent; - float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); - - if (maxcomp < 1e-32f) { - rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; - } else { - float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; - - rgbe[0] = (unsigned char)(linear[0] * normalize); - rgbe[1] = (unsigned char)(linear[1] * normalize); - rgbe[2] = (unsigned char)(linear[2] * normalize); - rgbe[3] = (unsigned char)(exponent + 128); - } -} - -void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) -{ - unsigned char lengthbyte = STBIW_UCHAR(length+128); - STBIW_ASSERT(length+128 <= 255); - s->func(s->context, &lengthbyte, 1); - s->func(s->context, &databyte, 1); -} - -void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) -{ - unsigned char lengthbyte = STBIW_UCHAR(length); - STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code - s->func(s->context, &lengthbyte, 1); - s->func(s->context, data, length); -} - -void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) -{ - unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; - unsigned char rgbe[4]; - float linear[3]; - int x; - - scanlineheader[2] = (width&0xff00)>>8; - scanlineheader[3] = (width&0x00ff); - - /* skip RLE for images too small or large */ - if (width < 8 || width >= 32768) { - for (x=0; x < width; x++) { - switch (ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - s->func(s->context, rgbe, 4); - } - } else { - int c,r; - /* encode into scratch buffer */ - for (x=0; x < width; x++) { - switch(ncomp) { - case 4: /* fallthrough */ - case 3: linear[2] = scanline[x*ncomp + 2]; - linear[1] = scanline[x*ncomp + 1]; - linear[0] = scanline[x*ncomp + 0]; - break; - default: - linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; - break; - } - stbiw__linear_to_rgbe(rgbe, linear); - scratch[x + width*0] = rgbe[0]; - scratch[x + width*1] = rgbe[1]; - scratch[x + width*2] = rgbe[2]; - scratch[x + width*3] = rgbe[3]; - } - - s->func(s->context, scanlineheader, 4); - - /* RLE each component separately */ - for (c=0; c < 4; c++) { - unsigned char *comp = &scratch[width*c]; - - x = 0; - while (x < width) { - // find first run - r = x; - while (r+2 < width) { - if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) - break; - ++r; - } - if (r+2 >= width) - r = width; - // dump up to first run - while (x < r) { - int len = r-x; - if (len > 128) len = 128; - stbiw__write_dump_data(s, len, &comp[x]); - x += len; - } - // if there's a run, output it - if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd - // find next byte after run - while (r < width && comp[r] == comp[x]) - ++r; - // output run up to r - while (x < r) { - int len = r-x; - if (len > 127) len = 127; - stbiw__write_run_data(s, len, comp[x]); - x += len; - } - } - } - } - } -} - -static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) -{ - if (y <= 0 || x <= 0 || data == NULL) - return 0; - else { - // Each component is stored separately. Allocate scratch space for full output scanline. - unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); - int i, len; - char buffer[128]; - char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; - s->func(s->context, header, sizeof(header)-1); - - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); - s->func(s->context, buffer, len); - - for(i=0; i < y; i++) - stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*i*x); - STBIW_FREE(scratch); - return 1; - } -} - -STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_hdr_core(&s, x, y, comp, (float *) data); -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif // STBI_WRITE_NO_STDIO - - -////////////////////////////////////////////////////////////////////////////// -// -// PNG writer -// - -// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() -#define stbiw__sbraw(a) ((int *) (a) - 2) -#define stbiw__sbm(a) stbiw__sbraw(a)[0] -#define stbiw__sbn(a) stbiw__sbraw(a)[1] - -#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) -#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) -#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) - -#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) -#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) -#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) - -static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) -{ - int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; - void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); - STBIW_ASSERT(p); - if (p) { - if (!*arr) ((int *) p)[1] = 0; - *arr = (void *) ((int *) p + 2); - stbiw__sbm(*arr) = m; - } - return *arr; -} - -static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) -{ - while (*bitcount >= 8) { - stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); - *bitbuffer >>= 8; - *bitcount -= 8; - } - return data; -} - -static int stbiw__zlib_bitrev(int code, int codebits) -{ - int res=0; - while (codebits--) { - res = (res << 1) | (code & 1); - code >>= 1; - } - return res; -} - -static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) -{ - int i; - for (i=0; i < limit && i < 258; ++i) - if (a[i] != b[i]) break; - return i; -} - -static unsigned int stbiw__zhash(unsigned char *data) -{ - stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - return hash; -} - -#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) -#define stbiw__zlib_add(code,codebits) \ - (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) -#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) -// default huffman tables -#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) -#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) -#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) -#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) -#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) -#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) - -#define stbiw__ZHASH 16384 - -unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) -{ - static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; - static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; - static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; - static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; - unsigned int bitbuf=0; - int i,j, bitcount=0; - unsigned char *out = NULL; - unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(char**)); - if (quality < 5) quality = 5; - - stbiw__sbpush(out, 0x78); // DEFLATE 32K window - stbiw__sbpush(out, 0x5e); // FLEVEL = 1 - stbiw__zlib_add(1,1); // BFINAL = 1 - stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman - - for (i=0; i < stbiw__ZHASH; ++i) - hash_table[i] = NULL; - - i=0; - while (i < data_len-3) { - // hash next 3 bytes of data to be compressed - int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; - unsigned char *bestloc = 0; - unsigned char **hlist = hash_table[h]; - int n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32768) { // if entry lies within window - int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); - if (d >= best) best=d,bestloc=hlist[j]; - } - } - // when hash table entry is too long, delete half the entries - if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { - STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); - stbiw__sbn(hash_table[h]) = quality; - } - stbiw__sbpush(hash_table[h],data+i); - - if (bestloc) { - // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal - h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); - hlist = hash_table[h]; - n = stbiw__sbcount(hlist); - for (j=0; j < n; ++j) { - if (hlist[j]-data > i-32767) { - int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); - if (e > best) { // if next match is better, bail on current match - bestloc = NULL; - break; - } - } - } - } - - if (bestloc) { - int d = (int) (data+i - bestloc); // distance back - STBIW_ASSERT(d <= 32767 && best <= 258); - for (j=0; best > lengthc[j+1]-1; ++j); - stbiw__zlib_huff(j+257); - if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); - for (j=0; d > distc[j+1]-1; ++j); - stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); - if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); - i += best; - } else { - stbiw__zlib_huffb(data[i]); - ++i; - } - } - // write out final bytes - for (;i < data_len; ++i) - stbiw__zlib_huffb(data[i]); - stbiw__zlib_huff(256); // end of block - // pad with 0 bits to byte boundary - while (bitcount) - stbiw__zlib_add(0,1); - - for (i=0; i < stbiw__ZHASH; ++i) - (void) stbiw__sbfree(hash_table[i]); - STBIW_FREE(hash_table); - - { - // compute adler32 on input - unsigned int s1=1, s2=0; - int blocklen = (int) (data_len % 5552); - j=0; - while (j < data_len) { - for (i=0; i < blocklen; ++i) s1 += data[j+i], s2 += s1; - s1 %= 65521, s2 %= 65521; - j += blocklen; - blocklen = 5552; - } - stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s2)); - stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); - stbiw__sbpush(out, STBIW_UCHAR(s1)); - } - *out_len = stbiw__sbn(out); - // make returned pointer freeable - STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); - return (unsigned char *) stbiw__sbraw(out); -} - -static unsigned int stbiw__crc32(unsigned char *buffer, int len) -{ - static unsigned int crc_table[256] = - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - }; - - unsigned int crc = ~0u; - int i; - for (i=0; i < len; ++i) - crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; - return ~crc; -} - -#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) -#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); -#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) - -static void stbiw__wpcrc(unsigned char **data, int len) -{ - unsigned int crc = stbiw__crc32(*data - len - 4, len+4); - stbiw__wp32(*data, crc); -} - -static unsigned char stbiw__paeth(int a, int b, int c) -{ - int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); - if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); - if (pb <= pc) return STBIW_UCHAR(b); - return STBIW_UCHAR(c); -} - -// @OPTIMIZE: provide an option that always forces left-predict or paeth predict -unsigned char *stbi_write_png_to_mem(unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) -{ - int ctype[5] = { -1, 0, 4, 2, 6 }; - unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; - unsigned char *out,*o, *filt, *zlib; - signed char *line_buffer; - int i,j,k,p,zlen; - - if (stride_bytes == 0) - stride_bytes = x * n; - - filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; - line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } - for (j=0; j < y; ++j) { - static int mapping[] = { 0,1,2,3,4 }; - static int firstmap[] = { 0,1,0,5,6 }; - int *mymap = (j != 0) ? mapping : firstmap; - int best = 0, bestval = 0x7fffffff; - for (p=0; p < 2; ++p) { - for (k= p?best:0; k < 5; ++k) { // @TODO: clarity: rewrite this to go 0..5, and 'continue' the unwanted ones during 2nd pass - int type = mymap[k],est=0; - unsigned char *z = pixels + stride_bytes*j; - for (i=0; i < n; ++i) - switch (type) { - case 0: line_buffer[i] = z[i]; break; - case 1: line_buffer[i] = z[i]; break; - case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break; - case 3: line_buffer[i] = z[i] - (z[i-stride_bytes]>>1); break; - case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-stride_bytes],0)); break; - case 5: line_buffer[i] = z[i]; break; - case 6: line_buffer[i] = z[i]; break; - } - for (i=n; i < x*n; ++i) { - switch (type) { - case 0: line_buffer[i] = z[i]; break; - case 1: line_buffer[i] = z[i] - z[i-n]; break; - case 2: line_buffer[i] = z[i] - z[i-stride_bytes]; break; - case 3: line_buffer[i] = z[i] - ((z[i-n] + z[i-stride_bytes])>>1); break; - case 4: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-stride_bytes], z[i-stride_bytes-n]); break; - case 5: line_buffer[i] = z[i] - (z[i-n]>>1); break; - case 6: line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; - } - } - if (p) break; - for (i=0; i < x*n; ++i) - est += abs((signed char) line_buffer[i]); - if (est < bestval) { bestval = est; best = k; } - } - } - // when we get here, best contains the filter type, and line_buffer contains the data - filt[j*(x*n+1)] = (unsigned char) best; - STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); - } - STBIW_FREE(line_buffer); - zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, 8); // increase 8 to get smaller but use more memory - STBIW_FREE(filt); - if (!zlib) return 0; - - // each tag requires 12 bytes of overhead - out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); - if (!out) return 0; - *out_len = 8 + 12+13 + 12+zlen + 12; - - o=out; - STBIW_MEMMOVE(o,sig,8); o+= 8; - stbiw__wp32(o, 13); // header length - stbiw__wptag(o, "IHDR"); - stbiw__wp32(o, x); - stbiw__wp32(o, y); - *o++ = 8; - *o++ = STBIW_UCHAR(ctype[n]); - *o++ = 0; - *o++ = 0; - *o++ = 0; - stbiw__wpcrc(&o,13); - - stbiw__wp32(o, zlen); - stbiw__wptag(o, "IDAT"); - STBIW_MEMMOVE(o, zlib, zlen); - o += zlen; - STBIW_FREE(zlib); - stbiw__wpcrc(&o, zlen); - - stbiw__wp32(o,0); - stbiw__wptag(o, "IEND"); - stbiw__wpcrc(&o,0); - - STBIW_ASSERT(o == out + *out_len); - - return out; -} - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) -{ - FILE *f; - int len; - unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - f = fopen(filename, "wb"); - if (!f) { STBIW_FREE(png); return 0; } - fwrite(png, 1, len, f); - fclose(f); - STBIW_FREE(png); - return 1; -} -#endif - -STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) -{ - int len; - unsigned char *png = stbi_write_png_to_mem((unsigned char *) data, stride_bytes, x, y, comp, &len); - if (png == NULL) return 0; - func(context, png, len); - STBIW_FREE(png); - return 1; -} - - -/* *************************************************************************** - * - * JPEG writer - * - * This is based on Jon Olick's jo_jpeg.cpp: - * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html - */ - -static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, - 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; - -static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { - int bitBuf = *bitBufP, bitCnt = *bitCntP; - bitCnt += bs[1]; - bitBuf |= bs[0] << (24 - bitCnt); - while(bitCnt >= 8) { - unsigned char c = (bitBuf >> 16) & 255; - stbiw__putc(s, c); - if(c == 255) { - stbiw__putc(s, 0); - } - bitBuf <<= 8; - bitCnt -= 8; - } - *bitBufP = bitBuf; - *bitCntP = bitCnt; -} - -static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { - float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; - float z1, z2, z3, z4, z5, z11, z13; - - float tmp0 = d0 + d7; - float tmp7 = d0 - d7; - float tmp1 = d1 + d6; - float tmp6 = d1 - d6; - float tmp2 = d2 + d5; - float tmp5 = d2 - d5; - float tmp3 = d3 + d4; - float tmp4 = d3 - d4; - - // Even part - float tmp10 = tmp0 + tmp3; // phase 2 - float tmp13 = tmp0 - tmp3; - float tmp11 = tmp1 + tmp2; - float tmp12 = tmp1 - tmp2; - - d0 = tmp10 + tmp11; // phase 3 - d4 = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * 0.707106781f; // c4 - d2 = tmp13 + z1; // phase 5 - d6 = tmp13 - z1; - - // Odd part - tmp10 = tmp4 + tmp5; // phase 2 - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - // The rotator is modified from fig 4-8 to avoid extra negations. - z5 = (tmp10 - tmp12) * 0.382683433f; // c6 - z2 = tmp10 * 0.541196100f + z5; // c2-c6 - z4 = tmp12 * 1.306562965f + z5; // c2+c6 - z3 = tmp11 * 0.707106781f; // c4 - - z11 = tmp7 + z3; // phase 5 - z13 = tmp7 - z3; - - *d5p = z13 + z2; // phase 6 - *d3p = z13 - z2; - *d1p = z11 + z4; - *d7p = z11 - z4; - - *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; -} - -static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { - int tmp1 = val < 0 ? -val : val; - val = val < 0 ? val-1 : val; - bits[1] = 1; - while(tmp1 >>= 1) { - ++bits[1]; - } - bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { - } - // end0pos = first element in reverse order !=0 - if(end0pos == 0) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - return DU[0]; - } - for(i = 1; i <= end0pos; ++i) { - int startpos = i; - int nrzeroes; - unsigned short bits[2]; - for (; DU[i]==0 && i<=end0pos; ++i) { - } - nrzeroes = i-startpos; - if ( nrzeroes >= 16 ) { - int lng = nrzeroes>>4; - int nrmarker; - for (nrmarker=1; nrmarker <= lng; ++nrmarker) - stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); - nrzeroes &= 15; - } - stbiw__jpg_calcBits(DU[i], bits); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); - stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); - } - if(end0pos != 63) { - stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); - } - return DU[0]; -} - -static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { - // Constants that don't pollute global namespace - static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; - static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; - static const unsigned char std_ac_luminance_values[] = { - 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, - 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, - 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, - 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, - 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, - 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, - 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; - static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; - static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; - static const unsigned char std_ac_chrominance_values[] = { - 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, - 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, - 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, - 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, - 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, - 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, - 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa - }; - // Huffman tables - static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; - static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; - static const unsigned short YAC_HT[256][2] = { - {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const unsigned short UVAC_HT[256][2] = { - {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, - {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, - {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} - }; - static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, - 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; - static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, - 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; - static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, - 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; - - int row, col, i, k; - float fdtbl_Y[64], fdtbl_UV[64]; - unsigned char YTable[64], UVTable[64]; - - if(!data || !width || !height || comp > 4 || comp < 1) { - return 0; - } - - quality = quality ? quality : 90; - quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; - quality = quality < 50 ? 5000 / quality : 200 - quality * 2; - - for(i = 0; i < 64; ++i) { - int uvti, yti = (YQT[i]*quality+50)/100; - YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); - uvti = (UVQT[i]*quality+50)/100; - UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); - } - - for(row = 0, k = 0; row < 8; ++row) { - for(col = 0; col < 8; ++col, ++k) { - fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); - } - } - - // Write Headers - { - static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; - static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; - const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), - 3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; - s->func(s->context, (void*)head0, sizeof(head0)); - s->func(s->context, (void*)YTable, sizeof(YTable)); - stbiw__putc(s, 1); - s->func(s->context, UVTable, sizeof(UVTable)); - s->func(s->context, (void*)head1, sizeof(head1)); - s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); - s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); - stbiw__putc(s, 0x10); // HTYACinfo - s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); - s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); - stbiw__putc(s, 1); // HTUDCinfo - s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); - stbiw__putc(s, 0x11); // HTUACinfo - s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); - s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); - s->func(s->context, (void*)head2, sizeof(head2)); - } - - // Encode 8x8 macroblocks - { - static const unsigned short fillBits[] = {0x7F, 7}; - const unsigned char *imageData = (const unsigned char *)data; - int DCY=0, DCU=0, DCV=0; - int bitBuf=0, bitCnt=0; - // comp == 2 is grey+alpha (alpha is ignored) - int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; - int x, y, pos; - for(y = 0; y < height; y += 8) { - for(x = 0; x < width; x += 8) { - float YDU[64], UDU[64], VDU[64]; - for(row = y, pos = 0; row < y+8; ++row) { - for(col = x; col < x+8; ++col, ++pos) { - int p = row*width*comp + col*comp; - float r, g, b; - if(row >= height) { - p -= width*comp*(row+1 - height); - } - if(col >= width) { - p -= comp*(col+1 - width); - } - - r = imageData[p+0]; - g = imageData[p+ofsG]; - b = imageData[p+ofsB]; - YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128; - UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b; - VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b; - } - } - - DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT); - DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); - DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); - } - } - - // Do the bit alignment of the EOI marker - stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); - } - - // EOI - stbiw__putc(s, 0xFF); - stbiw__putc(s, 0xD9); - - return 1; -} - -STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s; - stbi__start_write_callbacks(&s, func, context); - return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); -} - - -#ifndef STBI_WRITE_NO_STDIO -STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) -{ - stbi__write_context s; - if (stbi__start_write_file(&s,filename)) { - int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); - stbi__end_write_file(&s); - return r; - } else - return 0; -} -#endif - -#endif // STB_IMAGE_WRITE_IMPLEMENTATION - -/* Revision history - 1.07 (2017-07-24) - doc fix - 1.06 (2017-07-23) - writing JPEG (using Jon Olick's code) - 1.05 ??? - 1.04 (2017-03-03) - monochrome BMP expansion - 1.03 ??? - 1.02 (2016-04-02) - avoid allocating large structures on the stack - 1.01 (2016-01-16) - STBIW_REALLOC_SIZED: support allocators with no realloc support - avoid race-condition in crc initialization - minor compile issues - 1.00 (2015-09-14) - installable file IO function - 0.99 (2015-09-13) - warning fixes; TGA rle support - 0.98 (2015-04-08) - added STBIW_MALLOC, STBIW_ASSERT etc - 0.97 (2015-01-18) - fixed HDR asserts, rewrote HDR rle logic - 0.96 (2015-01-17) - add HDR output - fix monochrome BMP - 0.95 (2014-08-17) - add monochrome TGA output - 0.94 (2014-05-31) - rename private functions to avoid conflicts with stb_image.h - 0.93 (2014-05-27) - warning fixes - 0.92 (2010-08-01) - casts to unsigned char to fix warnings - 0.91 (2010-07-17) - first public release - 0.90 first internal release -*/ - -/* ------------------------------------------------------------------------------- -This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------- -ALTERNATIVE A - MIT License -Copyright (c) 2017 Sean Barrett -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ------------------------------------------------------------------------------- -ALTERNATIVE B - Public Domain (www.unlicense.org) -This is free and unencumbered software released into the public domain. -Anyone is free to copy, modify, publish, use, compile, sell, or distribute this -software, either in source code form or as a compiled binary, for any purpose, -commercial or non-commercial, and by any means. -In jurisdictions that recognize copyright laws, the author or authors of this -software dedicate any and all copyright interest in the software to the public -domain. We make this dedication for the benefit of the public at large and to -the detriment of our heirs and successors. We intend this dedication to be an -overt act of relinquishment in perpetuity of all present and future rights to -this software under copyright law. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------- -*/ +/* stb_image_write - v1.15 - public domain - http://nothings.org/stb + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + +ABOUT: + + This header file is a library for writing images to C stdio or a callback. + + 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 STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +UNICODE: + + If compiling for Windows and you wish to use Unicode filenames, compile + with + #define STBIW_WINDOWS_UTF8 + and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert + Windows wchar_t filenames to utf8. + +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_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + 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 + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + 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 '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 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + 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 'stbi_write_png_compression_level' (it defaults to 8). + + 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. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + 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). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +#include + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +extern int stbi_write_tga_with_rle; +extern int stbi_write_png_compression_level; +extern int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); + +#ifdef STBI_WINDOWS_UTF8 +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF 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); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +static int stbi__flip_vertically_on_write = 0; + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; + unsigned char buffer[64]; + int buf_used; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +#ifdef __cplusplus +#define STBIW_EXTERN extern "C" +#else +#define STBIW_EXTERN extern +#endif +STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); + +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbiw__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode))) + return 0; + +#if _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f = stbiw__fopen(filename, "wb"); + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__write_flush(stbi__write_context *s) +{ + if (s->buf_used) { + s->func(s->context, &s->buffer, s->buf_used); + s->buf_used = 0; + } +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write1(stbi__write_context *s, unsigned char a) +{ + if (s->buf_used + 1 > sizeof(s->buffer)) + stbiw__write_flush(s); + s->buffer[s->buf_used++] = a; +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + int n; + if (s->buf_used + 3 > sizeof(s->buffer)) + stbiw__write_flush(s); + n = s->buf_used; + s->buf_used = n+3; + s->buffer[n+0] = a; + s->buffer[n+1] = b; + s->buffer[n+2] = c; +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + stbiw__write1(s, d[comp - 1]); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + stbiw__write1(s, d[0]); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + stbiw__write1(s, d[comp - 1]); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) { + j_end = -1; j = y-1; + } else { + j_end = y; j = 0; + } + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + stbiw__write_flush(s); + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + stbiw__write1(s, header); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + stbiw__write1(s, header); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + stbiw__write_flush(s); + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef __STDC_WANT_SECURE_LIB__ + len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) { best=d; bestloc=hlist[j]; } + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } + s1 %= 65521; s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + // first loop isn't optimized since it's just one pixel + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + + f = stbiw__fopen(filename, "wb"); + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k, subsample; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + subsample = quality <= 90 ? 1 : 0; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + const unsigned char *dataR = (const unsigned char *)data; + const unsigned char *dataG = dataR + ofsG; + const unsigned char *dataB = dataR + ofsB; + int x, y, pos; + if(subsample) { + for(y = 0; y < height; y += 16) { + for(x = 0; x < width; x += 16) { + float Y[256], U[256], V[256]; + for(row = y, pos = 0; row < y+16; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+16; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + + // subsample U,V + { + float subU[64], subV[64]; + int yy, xx; + for(yy = 0, pos = 0; yy < 8; ++yy) { + for(xx = 0; xx < 8; ++xx, ++pos) { + int j = yy*32+xx*2; + subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; + subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; + } + } + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + } else { + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float Y[64], U[64], V[64]; + for(row = y, pos = 0; row < y+8; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+8; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels + 1.13 + 1.12 + 1.11 (2019-08-11) + + 1.10 (2019-02-07) + support utf8 filenames in Windows; fix warnings and platform ifdefs + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/extern/sfml/include/SFML/Audio.hpp b/extern/sfml/include/SFML/Audio.hpp index 68fe1a6..7eb2d67 100644 --- a/extern/sfml/include/SFML/Audio.hpp +++ b/extern/sfml/include/SFML/Audio.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/AlResource.hpp b/extern/sfml/include/SFML/Audio/AlResource.hpp index f670c13..6cf5eac 100644 --- a/extern/sfml/include/SFML/Audio/AlResource.hpp +++ b/extern/sfml/include/SFML/Audio/AlResource.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/Export.hpp b/extern/sfml/include/SFML/Audio/Export.hpp index c21ffb6..0b0c610 100644 --- a/extern/sfml/include/SFML/Audio/Export.hpp +++ b/extern/sfml/include/SFML/Audio/Export.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/InputSoundFile.hpp b/extern/sfml/include/SFML/Audio/InputSoundFile.hpp index 4c9eb95..c82ed43 100644 --- a/extern/sfml/include/SFML/Audio/InputSoundFile.hpp +++ b/extern/sfml/include/SFML/Audio/InputSoundFile.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/Listener.hpp b/extern/sfml/include/SFML/Audio/Listener.hpp index 569eb91..c4051b9 100644 --- a/extern/sfml/include/SFML/Audio/Listener.hpp +++ b/extern/sfml/include/SFML/Audio/Listener.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/Music.hpp b/extern/sfml/include/SFML/Audio/Music.hpp index bbe84c8..e68277a 100644 --- a/extern/sfml/include/SFML/Audio/Music.hpp +++ b/extern/sfml/include/SFML/Audio/Music.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/OutputSoundFile.hpp b/extern/sfml/include/SFML/Audio/OutputSoundFile.hpp index 6247ef0..54c8318 100644 --- a/extern/sfml/include/SFML/Audio/OutputSoundFile.hpp +++ b/extern/sfml/include/SFML/Audio/OutputSoundFile.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/Sound.hpp b/extern/sfml/include/SFML/Audio/Sound.hpp index 909f4c1..513379f 100644 --- a/extern/sfml/include/SFML/Audio/Sound.hpp +++ b/extern/sfml/include/SFML/Audio/Sound.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundBuffer.hpp b/extern/sfml/include/SFML/Audio/SoundBuffer.hpp index 8b8391a..a8f583a 100644 --- a/extern/sfml/include/SFML/Audio/SoundBuffer.hpp +++ b/extern/sfml/include/SFML/Audio/SoundBuffer.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundBufferRecorder.hpp b/extern/sfml/include/SFML/Audio/SoundBufferRecorder.hpp index 9e100d1..0646bef 100644 --- a/extern/sfml/include/SFML/Audio/SoundBufferRecorder.hpp +++ b/extern/sfml/include/SFML/Audio/SoundBufferRecorder.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundFileFactory.hpp b/extern/sfml/include/SFML/Audio/SoundFileFactory.hpp index cae1f69..84c9fa1 100644 --- a/extern/sfml/include/SFML/Audio/SoundFileFactory.hpp +++ b/extern/sfml/include/SFML/Audio/SoundFileFactory.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundFileFactory.inl b/extern/sfml/include/SFML/Audio/SoundFileFactory.inl index bbfa91f..69e4279 100644 --- a/extern/sfml/include/SFML/Audio/SoundFileFactory.inl +++ b/extern/sfml/include/SFML/Audio/SoundFileFactory.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundFileReader.hpp b/extern/sfml/include/SFML/Audio/SoundFileReader.hpp index 61dd998..8671b60 100644 --- a/extern/sfml/include/SFML/Audio/SoundFileReader.hpp +++ b/extern/sfml/include/SFML/Audio/SoundFileReader.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundFileWriter.hpp b/extern/sfml/include/SFML/Audio/SoundFileWriter.hpp index ff90bab..5b42393 100644 --- a/extern/sfml/include/SFML/Audio/SoundFileWriter.hpp +++ b/extern/sfml/include/SFML/Audio/SoundFileWriter.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundRecorder.hpp b/extern/sfml/include/SFML/Audio/SoundRecorder.hpp index 53cf73a..725f1de 100644 --- a/extern/sfml/include/SFML/Audio/SoundRecorder.hpp +++ b/extern/sfml/include/SFML/Audio/SoundRecorder.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundSource.hpp b/extern/sfml/include/SFML/Audio/SoundSource.hpp index ce795d6..a07e136 100644 --- a/extern/sfml/include/SFML/Audio/SoundSource.hpp +++ b/extern/sfml/include/SFML/Audio/SoundSource.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Audio/SoundStream.hpp b/extern/sfml/include/SFML/Audio/SoundStream.hpp index 31c6b9f..fb63eef 100644 --- a/extern/sfml/include/SFML/Audio/SoundStream.hpp +++ b/extern/sfml/include/SFML/Audio/SoundStream.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Config.hpp b/extern/sfml/include/SFML/Config.hpp index 3f282f2..2066b73 100644 --- a/extern/sfml/include/SFML/Config.hpp +++ b/extern/sfml/include/SFML/Config.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -91,6 +91,11 @@ // OpenBSD #define SFML_SYSTEM_OPENBSD + #elif defined(__NetBSD__) + + // NetBSD + #define SFML_SYSTEM_NETBSD + #else // Unsupported UNIX system diff --git a/extern/sfml/include/SFML/GpuPreference.hpp b/extern/sfml/include/SFML/GpuPreference.hpp index d0cd9ad..b4f4cd9 100644 --- a/extern/sfml/include/SFML/GpuPreference.hpp +++ b/extern/sfml/include/SFML/GpuPreference.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics.hpp b/extern/sfml/include/SFML/Graphics.hpp index 191c83f..5567ef6 100644 --- a/extern/sfml/include/SFML/Graphics.hpp +++ b/extern/sfml/include/SFML/Graphics.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/BlendMode.hpp b/extern/sfml/include/SFML/Graphics/BlendMode.hpp index 4f8462b..1acdd06 100644 --- a/extern/sfml/include/SFML/Graphics/BlendMode.hpp +++ b/extern/sfml/include/SFML/Graphics/BlendMode.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -68,9 +68,11 @@ struct SFML_GRAPHICS_API BlendMode //////////////////////////////////////////////////////// enum Equation { - Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor - Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor - ReverseSubtract //!< Pixel = Dst * DstFactor - Src * SrcFactor + Add, //!< Pixel = Src * SrcFactor + Dst * DstFactor + Subtract, //!< Pixel = Src * SrcFactor - Dst * DstFactor + ReverseSubtract, //!< Pixel = Dst * DstFactor - Src * SrcFactor + Min, //!< Pixel = min(Dst, Src) + Max //!< Pixel = max(Dst, Src) }; //////////////////////////////////////////////////////////// @@ -150,6 +152,8 @@ SFML_GRAPHICS_API bool operator !=(const BlendMode& left, const BlendMode& right SFML_GRAPHICS_API extern const BlendMode BlendAlpha; //!< Blend source and dest according to dest alpha SFML_GRAPHICS_API extern const BlendMode BlendAdd; //!< Add source to dest SFML_GRAPHICS_API extern const BlendMode BlendMultiply; //!< Multiply source and dest +SFML_GRAPHICS_API extern const BlendMode BlendMin; //!< Take minimum between source and dest +SFML_GRAPHICS_API extern const BlendMode BlendMax; //!< Take maximum between source and dest SFML_GRAPHICS_API extern const BlendMode BlendNone; //!< Overwrite dest with source } // namespace sf diff --git a/extern/sfml/include/SFML/Graphics/CircleShape.hpp b/extern/sfml/include/SFML/Graphics/CircleShape.hpp index 6f01c8d..467530b 100644 --- a/extern/sfml/include/SFML/Graphics/CircleShape.hpp +++ b/extern/sfml/include/SFML/Graphics/CircleShape.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Color.hpp b/extern/sfml/include/SFML/Graphics/Color.hpp index 6152b8c..94fbe40 100644 --- a/extern/sfml/include/SFML/Graphics/Color.hpp +++ b/extern/sfml/include/SFML/Graphics/Color.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/ConvexShape.hpp b/extern/sfml/include/SFML/Graphics/ConvexShape.hpp index 4592565..6ad877e 100644 --- a/extern/sfml/include/SFML/Graphics/ConvexShape.hpp +++ b/extern/sfml/include/SFML/Graphics/ConvexShape.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Drawable.hpp b/extern/sfml/include/SFML/Graphics/Drawable.hpp index 612a820..aa035e1 100644 --- a/extern/sfml/include/SFML/Graphics/Drawable.hpp +++ b/extern/sfml/include/SFML/Graphics/Drawable.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Export.hpp b/extern/sfml/include/SFML/Graphics/Export.hpp index 88e4358..1453466 100644 --- a/extern/sfml/include/SFML/Graphics/Export.hpp +++ b/extern/sfml/include/SFML/Graphics/Export.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Font.hpp b/extern/sfml/include/SFML/Graphics/Font.hpp index b8e5d92..f5e1d9b 100644 --- a/extern/sfml/include/SFML/Graphics/Font.hpp +++ b/extern/sfml/include/SFML/Graphics/Font.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -217,7 +217,7 @@ class SFML_GRAPHICS_API Font /// \return Kerning value for \a first and \a second, in pixels /// //////////////////////////////////////////////////////////// - float getKerning(Uint32 first, Uint32 second, unsigned int characterSize) const; + float getKerning(Uint32 first, Uint32 second, unsigned int characterSize, bool bold = false) const; //////////////////////////////////////////////////////////// /// \brief Get the line spacing diff --git a/extern/sfml/include/SFML/Graphics/Glsl.hpp b/extern/sfml/include/SFML/Graphics/Glsl.hpp index 6ea8694..1ae449b 100644 --- a/extern/sfml/include/SFML/Graphics/Glsl.hpp +++ b/extern/sfml/include/SFML/Graphics/Glsl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Glsl.inl b/extern/sfml/include/SFML/Graphics/Glsl.inl index 4a839fd..e2b3285 100644 --- a/extern/sfml/include/SFML/Graphics/Glsl.inl +++ b/extern/sfml/include/SFML/Graphics/Glsl.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Glyph.hpp b/extern/sfml/include/SFML/Graphics/Glyph.hpp index 9ee0017..32e45bc 100644 --- a/extern/sfml/include/SFML/Graphics/Glyph.hpp +++ b/extern/sfml/include/SFML/Graphics/Glyph.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -52,6 +52,8 @@ class SFML_GRAPHICS_API Glyph // Member data //////////////////////////////////////////////////////////// float advance; //!< Offset to move horizontally to the next character + int lsbDelta; //!< Left offset after forced autohint. Internally used by getKerning() + int rsbDelta; //!< Right offset after forced autohint. Internally used by getKerning() FloatRect bounds; //!< Bounding rectangle of the glyph, in coordinates relative to the baseline IntRect textureRect; //!< Texture coordinates of the glyph inside the font's texture }; diff --git a/extern/sfml/include/SFML/Graphics/Image.hpp b/extern/sfml/include/SFML/Graphics/Image.hpp index f2a7518..edd1404 100644 --- a/extern/sfml/include/SFML/Graphics/Image.hpp +++ b/extern/sfml/include/SFML/Graphics/Image.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -155,6 +155,24 @@ class SFML_GRAPHICS_API Image //////////////////////////////////////////////////////////// bool saveToFile(const std::string& filename) const; + //////////////////////////////////////////////////////////// + /// \brief Save the image to a buffer in memory + /// + /// The format of the image must be specified. + /// The supported image formats are bmp, png, tga and jpg. + /// This function fails if the image is empty, or if + /// the format was invalid. + /// + /// \param output Buffer to fill with encoded data + /// \param format Encoding format to use + /// + /// \return True if saving was successful + /// + /// \see create, loadFromFile, loadFromMemory, saveToFile + /// + //////////////////////////////////////////////////////////// + bool saveToMemory(std::vector& output, const std::string& format) const; + //////////////////////////////////////////////////////////// /// \brief Return the size (width and height) of the image /// diff --git a/extern/sfml/include/SFML/Graphics/PrimitiveType.hpp b/extern/sfml/include/SFML/Graphics/PrimitiveType.hpp index 08b675e..f782192 100644 --- a/extern/sfml/include/SFML/Graphics/PrimitiveType.hpp +++ b/extern/sfml/include/SFML/Graphics/PrimitiveType.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Rect.hpp b/extern/sfml/include/SFML/Graphics/Rect.hpp index d6cba3d..22f8c9c 100644 --- a/extern/sfml/include/SFML/Graphics/Rect.hpp +++ b/extern/sfml/include/SFML/Graphics/Rect.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Rect.inl b/extern/sfml/include/SFML/Graphics/Rect.inl index d996c60..b6962fe 100644 --- a/extern/sfml/include/SFML/Graphics/Rect.inl +++ b/extern/sfml/include/SFML/Graphics/Rect.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/RectangleShape.hpp b/extern/sfml/include/SFML/Graphics/RectangleShape.hpp index b337579..5ff8364 100644 --- a/extern/sfml/include/SFML/Graphics/RectangleShape.hpp +++ b/extern/sfml/include/SFML/Graphics/RectangleShape.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/RenderStates.hpp b/extern/sfml/include/SFML/Graphics/RenderStates.hpp index ed6c913..9e24bc0 100644 --- a/extern/sfml/include/SFML/Graphics/RenderStates.hpp +++ b/extern/sfml/include/SFML/Graphics/RenderStates.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/RenderTarget.hpp b/extern/sfml/include/SFML/Graphics/RenderTarget.hpp index 58bb8c3..da5a4c2 100644 --- a/extern/sfml/include/SFML/Graphics/RenderTarget.hpp +++ b/extern/sfml/include/SFML/Graphics/RenderTarget.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/RenderTexture.hpp b/extern/sfml/include/SFML/Graphics/RenderTexture.hpp index 0931ee7..f35e49b 100644 --- a/extern/sfml/include/SFML/Graphics/RenderTexture.hpp +++ b/extern/sfml/include/SFML/Graphics/RenderTexture.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/RenderWindow.hpp b/extern/sfml/include/SFML/Graphics/RenderWindow.hpp index bf32e35..dc52002 100644 --- a/extern/sfml/include/SFML/Graphics/RenderWindow.hpp +++ b/extern/sfml/include/SFML/Graphics/RenderWindow.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Shader.hpp b/extern/sfml/include/SFML/Graphics/Shader.hpp index 9ac485a..00673b8 100644 --- a/extern/sfml/include/SFML/Graphics/Shader.hpp +++ b/extern/sfml/include/SFML/Graphics/Shader.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Shape.hpp b/extern/sfml/include/SFML/Graphics/Shape.hpp index 44893cb..251b3cd 100644 --- a/extern/sfml/include/SFML/Graphics/Shape.hpp +++ b/extern/sfml/include/SFML/Graphics/Shape.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Sprite.hpp b/extern/sfml/include/SFML/Graphics/Sprite.hpp index 9581192..8720202 100644 --- a/extern/sfml/include/SFML/Graphics/Sprite.hpp +++ b/extern/sfml/include/SFML/Graphics/Sprite.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Text.hpp b/extern/sfml/include/SFML/Graphics/Text.hpp index 8b1a093..c328537 100644 --- a/extern/sfml/include/SFML/Graphics/Text.hpp +++ b/extern/sfml/include/SFML/Graphics/Text.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Texture.hpp b/extern/sfml/include/SFML/Graphics/Texture.hpp index 0fbb0f9..ddd5e3a 100644 --- a/extern/sfml/include/SFML/Graphics/Texture.hpp +++ b/extern/sfml/include/SFML/Graphics/Texture.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Transform.hpp b/extern/sfml/include/SFML/Graphics/Transform.hpp index d46aeeb..821a597 100644 --- a/extern/sfml/include/SFML/Graphics/Transform.hpp +++ b/extern/sfml/include/SFML/Graphics/Transform.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Transformable.hpp b/extern/sfml/include/SFML/Graphics/Transformable.hpp index c1560e2..698809a 100644 --- a/extern/sfml/include/SFML/Graphics/Transformable.hpp +++ b/extern/sfml/include/SFML/Graphics/Transformable.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/Vertex.hpp b/extern/sfml/include/SFML/Graphics/Vertex.hpp index 6755479..29f05c6 100644 --- a/extern/sfml/include/SFML/Graphics/Vertex.hpp +++ b/extern/sfml/include/SFML/Graphics/Vertex.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/VertexArray.hpp b/extern/sfml/include/SFML/Graphics/VertexArray.hpp index 1645f65..2fd030b 100644 --- a/extern/sfml/include/SFML/Graphics/VertexArray.hpp +++ b/extern/sfml/include/SFML/Graphics/VertexArray.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/VertexBuffer.hpp b/extern/sfml/include/SFML/Graphics/VertexBuffer.hpp index 7daaf01..3615ca8 100644 --- a/extern/sfml/include/SFML/Graphics/VertexBuffer.hpp +++ b/extern/sfml/include/SFML/Graphics/VertexBuffer.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Graphics/View.hpp b/extern/sfml/include/SFML/Graphics/View.hpp index 6712c94..2dc7c8d 100644 --- a/extern/sfml/include/SFML/Graphics/View.hpp +++ b/extern/sfml/include/SFML/Graphics/View.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Main.hpp b/extern/sfml/include/SFML/Main.hpp index 27e3296..b298afa 100644 --- a/extern/sfml/include/SFML/Main.hpp +++ b/extern/sfml/include/SFML/Main.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network.hpp b/extern/sfml/include/SFML/Network.hpp index f3f98c3..22d9caf 100644 --- a/extern/sfml/include/SFML/Network.hpp +++ b/extern/sfml/include/SFML/Network.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/Export.hpp b/extern/sfml/include/SFML/Network/Export.hpp index 516a9d0..c9110de 100644 --- a/extern/sfml/include/SFML/Network/Export.hpp +++ b/extern/sfml/include/SFML/Network/Export.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/Ftp.hpp b/extern/sfml/include/SFML/Network/Ftp.hpp index ddc3a9c..9bbaa97 100644 --- a/extern/sfml/include/SFML/Network/Ftp.hpp +++ b/extern/sfml/include/SFML/Network/Ftp.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/Http.hpp b/extern/sfml/include/SFML/Network/Http.hpp index 6175472..a2c7d56 100644 --- a/extern/sfml/include/SFML/Network/Http.hpp +++ b/extern/sfml/include/SFML/Network/Http.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/IpAddress.hpp b/extern/sfml/include/SFML/Network/IpAddress.hpp index b497b24..7ce5930 100644 --- a/extern/sfml/include/SFML/Network/IpAddress.hpp +++ b/extern/sfml/include/SFML/Network/IpAddress.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/Packet.hpp b/extern/sfml/include/SFML/Network/Packet.hpp index db9a797..9128c2f 100644 --- a/extern/sfml/include/SFML/Network/Packet.hpp +++ b/extern/sfml/include/SFML/Network/Packet.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/Socket.hpp b/extern/sfml/include/SFML/Network/Socket.hpp index 9ebb930..051599a 100644 --- a/extern/sfml/include/SFML/Network/Socket.hpp +++ b/extern/sfml/include/SFML/Network/Socket.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/SocketHandle.hpp b/extern/sfml/include/SFML/Network/SocketHandle.hpp index 688ea0b..20dea0b 100644 --- a/extern/sfml/include/SFML/Network/SocketHandle.hpp +++ b/extern/sfml/include/SFML/Network/SocketHandle.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/SocketSelector.hpp b/extern/sfml/include/SFML/Network/SocketSelector.hpp index 332f072..693e5ff 100644 --- a/extern/sfml/include/SFML/Network/SocketSelector.hpp +++ b/extern/sfml/include/SFML/Network/SocketSelector.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/TcpListener.hpp b/extern/sfml/include/SFML/Network/TcpListener.hpp index d0bdad4..ee5b396 100644 --- a/extern/sfml/include/SFML/Network/TcpListener.hpp +++ b/extern/sfml/include/SFML/Network/TcpListener.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/TcpSocket.hpp b/extern/sfml/include/SFML/Network/TcpSocket.hpp index 5778068..0532c7a 100644 --- a/extern/sfml/include/SFML/Network/TcpSocket.hpp +++ b/extern/sfml/include/SFML/Network/TcpSocket.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Network/UdpSocket.hpp b/extern/sfml/include/SFML/Network/UdpSocket.hpp index 14176f8..bf68620 100644 --- a/extern/sfml/include/SFML/Network/UdpSocket.hpp +++ b/extern/sfml/include/SFML/Network/UdpSocket.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/OpenGL.hpp b/extern/sfml/include/SFML/OpenGL.hpp index 45a3ac3..0cfa001 100644 --- a/extern/sfml/include/SFML/OpenGL.hpp +++ b/extern/sfml/include/SFML/OpenGL.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -45,7 +45,7 @@ #include -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #if defined(SFML_OPENGL_ES) #include diff --git a/extern/sfml/include/SFML/System.hpp b/extern/sfml/include/SFML/System.hpp index 3c82226..f7058c0 100644 --- a/extern/sfml/include/SFML/System.hpp +++ b/extern/sfml/include/SFML/System.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Clock.hpp b/extern/sfml/include/SFML/System/Clock.hpp index 2150347..d3239ad 100644 --- a/extern/sfml/include/SFML/System/Clock.hpp +++ b/extern/sfml/include/SFML/System/Clock.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Err.hpp b/extern/sfml/include/SFML/System/Err.hpp index 9ad1b29..babc6c1 100644 --- a/extern/sfml/include/SFML/System/Err.hpp +++ b/extern/sfml/include/SFML/System/Err.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Export.hpp b/extern/sfml/include/SFML/System/Export.hpp index b9691ee..066d620 100644 --- a/extern/sfml/include/SFML/System/Export.hpp +++ b/extern/sfml/include/SFML/System/Export.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/FileInputStream.hpp b/extern/sfml/include/SFML/System/FileInputStream.hpp index d46be62..0e5c1dd 100644 --- a/extern/sfml/include/SFML/System/FileInputStream.hpp +++ b/extern/sfml/include/SFML/System/FileInputStream.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/InputStream.hpp b/extern/sfml/include/SFML/System/InputStream.hpp index 28022ec..09542d8 100644 --- a/extern/sfml/include/SFML/System/InputStream.hpp +++ b/extern/sfml/include/SFML/System/InputStream.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Lock.hpp b/extern/sfml/include/SFML/System/Lock.hpp index 8667d14..453aebd 100644 --- a/extern/sfml/include/SFML/System/Lock.hpp +++ b/extern/sfml/include/SFML/System/Lock.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/MemoryInputStream.hpp b/extern/sfml/include/SFML/System/MemoryInputStream.hpp index 15cf38d..3979840 100644 --- a/extern/sfml/include/SFML/System/MemoryInputStream.hpp +++ b/extern/sfml/include/SFML/System/MemoryInputStream.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Mutex.hpp b/extern/sfml/include/SFML/System/Mutex.hpp index 34610c3..d07846f 100644 --- a/extern/sfml/include/SFML/System/Mutex.hpp +++ b/extern/sfml/include/SFML/System/Mutex.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/NativeActivity.hpp b/extern/sfml/include/SFML/System/NativeActivity.hpp index 25609b5..4d6ff1b 100644 --- a/extern/sfml/include/SFML/System/NativeActivity.hpp +++ b/extern/sfml/include/SFML/System/NativeActivity.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/NonCopyable.hpp b/extern/sfml/include/SFML/System/NonCopyable.hpp index c5b42c8..fa3ea4d 100644 --- a/extern/sfml/include/SFML/System/NonCopyable.hpp +++ b/extern/sfml/include/SFML/System/NonCopyable.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Sleep.hpp b/extern/sfml/include/SFML/System/Sleep.hpp index 9866865..e6b65dd 100644 --- a/extern/sfml/include/SFML/System/Sleep.hpp +++ b/extern/sfml/include/SFML/System/Sleep.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/String.hpp b/extern/sfml/include/SFML/System/String.hpp index 970105d..c48d7c4 100644 --- a/extern/sfml/include/SFML/System/String.hpp +++ b/extern/sfml/include/SFML/System/String.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/String.inl b/extern/sfml/include/SFML/System/String.inl index 0f3a890..5f5936b 100644 --- a/extern/sfml/include/SFML/System/String.inl +++ b/extern/sfml/include/SFML/System/String.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Thread.hpp b/extern/sfml/include/SFML/System/Thread.hpp index ead09e8..905d3f7 100644 --- a/extern/sfml/include/SFML/System/Thread.hpp +++ b/extern/sfml/include/SFML/System/Thread.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Thread.inl b/extern/sfml/include/SFML/System/Thread.inl index 55976e8..3b42c2c 100644 --- a/extern/sfml/include/SFML/System/Thread.inl +++ b/extern/sfml/include/SFML/System/Thread.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/ThreadLocal.hpp b/extern/sfml/include/SFML/System/ThreadLocal.hpp index 065f29c..7b4012e 100644 --- a/extern/sfml/include/SFML/System/ThreadLocal.hpp +++ b/extern/sfml/include/SFML/System/ThreadLocal.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/ThreadLocalPtr.hpp b/extern/sfml/include/SFML/System/ThreadLocalPtr.hpp index a6ecd9d..fb4a628 100644 --- a/extern/sfml/include/SFML/System/ThreadLocalPtr.hpp +++ b/extern/sfml/include/SFML/System/ThreadLocalPtr.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/ThreadLocalPtr.inl b/extern/sfml/include/SFML/System/ThreadLocalPtr.inl index f76c77f..61b6813 100644 --- a/extern/sfml/include/SFML/System/ThreadLocalPtr.inl +++ b/extern/sfml/include/SFML/System/ThreadLocalPtr.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Time.hpp b/extern/sfml/include/SFML/System/Time.hpp index 1478730..001f211 100644 --- a/extern/sfml/include/SFML/System/Time.hpp +++ b/extern/sfml/include/SFML/System/Time.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Utf.hpp b/extern/sfml/include/SFML/System/Utf.hpp index af56753..f614d79 100644 --- a/extern/sfml/include/SFML/System/Utf.hpp +++ b/extern/sfml/include/SFML/System/Utf.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Utf.inl b/extern/sfml/include/SFML/System/Utf.inl index d1ea73d..091b7a1 100644 --- a/extern/sfml/include/SFML/System/Utf.inl +++ b/extern/sfml/include/SFML/System/Utf.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -62,11 +62,11 @@ In Utf<8>::decode(In begin, In end, Uint32& output, Uint32 replacement) output = 0; switch (trailingBytes) { - case 5: output += static_cast(*begin++); output <<= 6; - case 4: output += static_cast(*begin++); output <<= 6; - case 3: output += static_cast(*begin++); output <<= 6; - case 2: output += static_cast(*begin++); output <<= 6; - case 1: output += static_cast(*begin++); output <<= 6; + case 5: output += static_cast(*begin++); output <<= 6; // fallthrough + case 4: output += static_cast(*begin++); output <<= 6; // fallthrough + case 3: output += static_cast(*begin++); output <<= 6; // fallthrough + case 2: output += static_cast(*begin++); output <<= 6; // fallthrough + case 1: output += static_cast(*begin++); output <<= 6; // fallthrough case 0: output += static_cast(*begin++); } output -= offsets[trailingBytes]; @@ -114,9 +114,9 @@ Out Utf<8>::encode(Uint32 input, Out output, Uint8 replacement) Uint8 bytes[4]; switch (bytestoWrite) { - case 4: bytes[3] = static_cast((input | 0x80) & 0xBF); input >>= 6; - case 3: bytes[2] = static_cast((input | 0x80) & 0xBF); input >>= 6; - case 2: bytes[1] = static_cast((input | 0x80) & 0xBF); input >>= 6; + case 4: bytes[3] = static_cast((input | 0x80) & 0xBF); input >>= 6; // fallthrough + case 3: bytes[2] = static_cast((input | 0x80) & 0xBF); input >>= 6; // fallthrough + case 2: bytes[1] = static_cast((input | 0x80) & 0xBF); input >>= 6; // fallthrough case 1: bytes[0] = static_cast (input | firstBytes[bytestoWrite]); } diff --git a/extern/sfml/include/SFML/System/Vector2.hpp b/extern/sfml/include/SFML/System/Vector2.hpp index 429e649..e064c43 100644 --- a/extern/sfml/include/SFML/System/Vector2.hpp +++ b/extern/sfml/include/SFML/System/Vector2.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Vector2.inl b/extern/sfml/include/SFML/System/Vector2.inl index 848395b..2267f5d 100644 --- a/extern/sfml/include/SFML/System/Vector2.inl +++ b/extern/sfml/include/SFML/System/Vector2.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Vector3.hpp b/extern/sfml/include/SFML/System/Vector3.hpp index 08220c9..5a8c5f2 100644 --- a/extern/sfml/include/SFML/System/Vector3.hpp +++ b/extern/sfml/include/SFML/System/Vector3.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/System/Vector3.inl b/extern/sfml/include/SFML/System/Vector3.inl index 852c6db..680b128 100644 --- a/extern/sfml/include/SFML/System/Vector3.inl +++ b/extern/sfml/include/SFML/System/Vector3.inl @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window.hpp b/extern/sfml/include/SFML/Window.hpp index e3667b0..fc77f72 100644 --- a/extern/sfml/include/SFML/Window.hpp +++ b/extern/sfml/include/SFML/Window.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Clipboard.hpp b/extern/sfml/include/SFML/Window/Clipboard.hpp index 68a3797..cacf2a8 100644 --- a/extern/sfml/include/SFML/Window/Clipboard.hpp +++ b/extern/sfml/include/SFML/Window/Clipboard.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Context.hpp b/extern/sfml/include/SFML/Window/Context.hpp index 7ef9b9a..b834b09 100644 --- a/extern/sfml/include/SFML/Window/Context.hpp +++ b/extern/sfml/include/SFML/Window/Context.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/ContextSettings.hpp b/extern/sfml/include/SFML/Window/ContextSettings.hpp index d2d8438..e01d0ac 100644 --- a/extern/sfml/include/SFML/Window/ContextSettings.hpp +++ b/extern/sfml/include/SFML/Window/ContextSettings.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Cursor.hpp b/extern/sfml/include/SFML/Window/Cursor.hpp index ea29c50..5214f2e 100644 --- a/extern/sfml/include/SFML/Window/Cursor.hpp +++ b/extern/sfml/include/SFML/Window/Cursor.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -64,6 +64,14 @@ class SFML_WINDOW_API Cursor : NonCopyable /// sf::Cursor::SizeVertical | yes | yes | yes | /// sf::Cursor::SizeTopLeftBottomRight | no | yes* | yes | /// sf::Cursor::SizeBottomLeftTopRight | no | yes* | yes | + /// sf::Cursor::SizeLeft | yes | yes** | yes** | + /// sf::Cursor::SizeRight | yes | yes** | yes** | + /// sf::Cursor::SizeTop | yes | yes** | yes** | + /// sf::Cursor::SizeBottom | yes | yes** | yes** | + /// sf::Cursor::SizeTopLeft | yes | yes** | yes** | + /// sf::Cursor::SizeTopRight | yes | yes** | yes** | + /// sf::Cursor::SizeBottomLeft | yes | yes** | yes** | + /// sf::Cursor::SizeBottomRight | yes | yes** | yes** | /// sf::Cursor::SizeAll | yes | no | yes | /// sf::Cursor::Cross | yes | yes | yes | /// sf::Cursor::Help | yes | yes* | yes | @@ -72,6 +80,8 @@ class SFML_WINDOW_API Cursor : NonCopyable /// * These cursor types are undocumented so may not /// be available on all versions, but have been tested on 10.13 /// + /// ** On Windows and macOS, double-headed arrows are used + /// //////////////////////////////////////////////////////////// enum Type { @@ -84,6 +94,14 @@ class SFML_WINDOW_API Cursor : NonCopyable SizeVertical, //!< Vertical double arrow cursor SizeTopLeftBottomRight, //!< Double arrow cursor going from top-left to bottom-right SizeBottomLeftTopRight, //!< Double arrow cursor going from bottom-left to top-right + SizeLeft, //!< Left arrow cursor on Linux, same as SizeHorizontal on other platforms + SizeRight, //!< Right arrow cursor on Linux, same as SizeHorizontal on other platforms + SizeTop, //!< Up arrow cursor on Linux, same as SizeVertical on other platforms + SizeBottom, //!< Down arrow cursor on Linux, same as SizeVertical on other platforms + SizeTopLeft, //!< Top-left arrow cursor on Linux, same as SizeTopLeftBottomRight on other platforms + SizeBottomRight, //!< Bottom-right arrow cursor on Linux, same as SizeTopLeftBottomRight on other platforms + SizeBottomLeft, //!< Bottom-left arrow cursor on Linux, same as SizeBottomLeftTopRight on other platforms + SizeTopRight, //!< Top-right arrow cursor on Linux, same as SizeBottomLeftTopRight on other platforms SizeAll, //!< Combination of SizeHorizontal and SizeVertical Cross, //!< Crosshair cursor Help, //!< Help cursor diff --git a/extern/sfml/include/SFML/Window/Event.hpp b/extern/sfml/include/SFML/Window/Event.hpp index 2b7c8dc..d771db5 100644 --- a/extern/sfml/include/SFML/Window/Event.hpp +++ b/extern/sfml/include/SFML/Window/Event.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Export.hpp b/extern/sfml/include/SFML/Window/Export.hpp index 11f27b3..2999e09 100644 --- a/extern/sfml/include/SFML/Window/Export.hpp +++ b/extern/sfml/include/SFML/Window/Export.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/GlResource.hpp b/extern/sfml/include/SFML/Window/GlResource.hpp index 223707e..dcc4f43 100644 --- a/extern/sfml/include/SFML/Window/GlResource.hpp +++ b/extern/sfml/include/SFML/Window/GlResource.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Joystick.hpp b/extern/sfml/include/SFML/Window/Joystick.hpp index dd5454c..de7b7b2 100644 --- a/extern/sfml/include/SFML/Window/Joystick.hpp +++ b/extern/sfml/include/SFML/Window/Joystick.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Keyboard.hpp b/extern/sfml/include/SFML/Window/Keyboard.hpp index 0bbcd8a..2fb320e 100644 --- a/extern/sfml/include/SFML/Window/Keyboard.hpp +++ b/extern/sfml/include/SFML/Window/Keyboard.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Mouse.hpp b/extern/sfml/include/SFML/Window/Mouse.hpp index d2b7fef..875e73a 100644 --- a/extern/sfml/include/SFML/Window/Mouse.hpp +++ b/extern/sfml/include/SFML/Window/Mouse.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Sensor.hpp b/extern/sfml/include/SFML/Window/Sensor.hpp index 337bc7f..98652d2 100644 --- a/extern/sfml/include/SFML/Window/Sensor.hpp +++ b/extern/sfml/include/SFML/Window/Sensor.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Touch.hpp b/extern/sfml/include/SFML/Window/Touch.hpp index bc9f72e..de8dcd4 100644 --- a/extern/sfml/include/SFML/Window/Touch.hpp +++ b/extern/sfml/include/SFML/Window/Touch.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/VideoMode.hpp b/extern/sfml/include/SFML/Window/VideoMode.hpp index d95ea49..a743542 100644 --- a/extern/sfml/include/SFML/Window/VideoMode.hpp +++ b/extern/sfml/include/SFML/Window/VideoMode.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Vulkan.hpp b/extern/sfml/include/SFML/Window/Vulkan.hpp index 00ee911..7454c98 100644 --- a/extern/sfml/include/SFML/Window/Vulkan.hpp +++ b/extern/sfml/include/SFML/Window/Vulkan.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/Window.hpp b/extern/sfml/include/SFML/Window/Window.hpp index bcbe872..a50e284 100644 --- a/extern/sfml/include/SFML/Window/Window.hpp +++ b/extern/sfml/include/SFML/Window/Window.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/WindowBase.hpp b/extern/sfml/include/SFML/Window/WindowBase.hpp index d1d4ff9..2984528 100644 --- a/extern/sfml/include/SFML/Window/WindowBase.hpp +++ b/extern/sfml/include/SFML/Window/WindowBase.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/Window/WindowHandle.hpp b/extern/sfml/include/SFML/Window/WindowHandle.hpp index 624ca73..8c35ef4 100644 --- a/extern/sfml/include/SFML/Window/WindowHandle.hpp +++ b/extern/sfml/include/SFML/Window/WindowHandle.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -42,7 +42,7 @@ namespace sf // Window handle is HWND (HWND__*) on Windows typedef HWND__* WindowHandle; -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) // Window handle is Window (unsigned long) on Unix - X11 typedef unsigned long WindowHandle; diff --git a/extern/sfml/include/SFML/Window/WindowStyle.hpp b/extern/sfml/include/SFML/Window/WindowStyle.hpp index ab611d2..a001599 100644 --- a/extern/sfml/include/SFML/Window/WindowStyle.hpp +++ b/extern/sfml/include/SFML/Window/WindowStyle.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/include/SFML/test.h b/extern/sfml/include/SFML/test.h deleted file mode 100644 index e1cda95..0000000 --- a/extern/sfml/include/SFML/test.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once -fdsafds -void test(); \ No newline at end of file diff --git a/extern/sfml/license.md b/extern/sfml/license.md index 1ae961a..0c3d519 100644 --- a/extern/sfml/license.md +++ b/extern/sfml/license.md @@ -1,6 +1,6 @@ # SFML -SFML - Copyright (C) 2007-2020 Laurent Gomila - laurent@sfml-dev.org +SFML - Copyright (C) 2007-2021 Laurent Gomila - laurent@sfml-dev.org This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/ALCheck.cpp b/extern/sfml/src/SFML/Audio/ALCheck.cpp index a7873a0..125fdb4 100644 --- a/extern/sfml/src/SFML/Audio/ALCheck.cpp +++ b/extern/sfml/src/SFML/Audio/ALCheck.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/ALCheck.hpp b/extern/sfml/src/SFML/Audio/ALCheck.hpp index 95259fb..9b1fb42 100644 --- a/extern/sfml/src/SFML/Audio/ALCheck.hpp +++ b/extern/sfml/src/SFML/Audio/ALCheck.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/AlResource.cpp b/extern/sfml/src/SFML/Audio/AlResource.cpp index 42a4945..e888a7a 100644 --- a/extern/sfml/src/SFML/Audio/AlResource.cpp +++ b/extern/sfml/src/SFML/Audio/AlResource.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/AudioDevice.cpp b/extern/sfml/src/SFML/Audio/AudioDevice.cpp index b9246df..25c86d9 100644 --- a/extern/sfml/src/SFML/Audio/AudioDevice.cpp +++ b/extern/sfml/src/SFML/Audio/AudioDevice.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/AudioDevice.hpp b/extern/sfml/src/SFML/Audio/AudioDevice.hpp index a8bac26..04a1562 100644 --- a/extern/sfml/src/SFML/Audio/AudioDevice.hpp +++ b/extern/sfml/src/SFML/Audio/AudioDevice.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/InputSoundFile.cpp b/extern/sfml/src/SFML/Audio/InputSoundFile.cpp index cb8bed0..ccac38b 100644 --- a/extern/sfml/src/SFML/Audio/InputSoundFile.cpp +++ b/extern/sfml/src/SFML/Audio/InputSoundFile.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -225,11 +225,11 @@ Uint64 InputSoundFile::getSampleOffset() const //////////////////////////////////////////////////////////// void InputSoundFile::seek(Uint64 sampleOffset) { - if (m_reader) + if (m_reader && m_channelCount != 0) { // The reader handles an overrun gracefully, but we // pre-check to keep our known position consistent - m_sampleOffset = std::min(sampleOffset, m_sampleCount); + m_sampleOffset = std::min(sampleOffset / m_channelCount * m_channelCount, m_sampleCount); m_reader->seek(m_sampleOffset); } } @@ -238,7 +238,7 @@ void InputSoundFile::seek(Uint64 sampleOffset) //////////////////////////////////////////////////////////// void InputSoundFile::seek(Time timeOffset) { - seek(static_cast(timeOffset.asSeconds() * m_sampleRate * m_channelCount)); + seek(static_cast(timeOffset.asSeconds() * m_sampleRate) * m_channelCount); } diff --git a/extern/sfml/src/SFML/Audio/Listener.cpp b/extern/sfml/src/SFML/Audio/Listener.cpp index 477f093..e88373e 100644 --- a/extern/sfml/src/SFML/Audio/Listener.cpp +++ b/extern/sfml/src/SFML/Audio/Listener.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/Music.cpp b/extern/sfml/src/SFML/Audio/Music.cpp index d711eff..77f88b3 100644 --- a/extern/sfml/src/SFML/Audio/Music.cpp +++ b/extern/sfml/src/SFML/Audio/Music.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/OutputSoundFile.cpp b/extern/sfml/src/SFML/Audio/OutputSoundFile.cpp index ddaafcf..cc94c31 100644 --- a/extern/sfml/src/SFML/Audio/OutputSoundFile.cpp +++ b/extern/sfml/src/SFML/Audio/OutputSoundFile.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/Sound.cpp b/extern/sfml/src/SFML/Audio/Sound.cpp index 505e958..59513a1 100644 --- a/extern/sfml/src/SFML/Audio/Sound.cpp +++ b/extern/sfml/src/SFML/Audio/Sound.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -160,6 +160,10 @@ Sound& Sound::operator =(const Sound& right) // the list of sound instances contained in the buffers and unnecessarily // destroy/create OpenAL sound sources + // Handle self-assignment here, as no copy-and-swap idiom is being used + if (this == &right) + return *this; + // Delegate to base class, which copies all the sound attributes SoundSource::operator=(right); diff --git a/extern/sfml/src/SFML/Audio/SoundBuffer.cpp b/extern/sfml/src/SFML/Audio/SoundBuffer.cpp index 3c23920..dc37bc8 100644 --- a/extern/sfml/src/SFML/Audio/SoundBuffer.cpp +++ b/extern/sfml/src/SFML/Audio/SoundBuffer.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundBufferRecorder.cpp b/extern/sfml/src/SFML/Audio/SoundBufferRecorder.cpp index 2d8b63c..81eb938 100644 --- a/extern/sfml/src/SFML/Audio/SoundBufferRecorder.cpp +++ b/extern/sfml/src/SFML/Audio/SoundBufferRecorder.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileFactory.cpp b/extern/sfml/src/SFML/Audio/SoundFileFactory.cpp index 2f7ddfc..58c9edd 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileFactory.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileFactory.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.cpp b/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.cpp index 88600e3..a2091ac 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.hpp b/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.hpp index 53cf0c4..657f793 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.hpp +++ b/extern/sfml/src/SFML/Audio/SoundFileReaderFlac.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.cpp b/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.cpp index 5585ab3..02a2060 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.hpp b/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.hpp index 7942bec..df2bff2 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.hpp +++ b/extern/sfml/src/SFML/Audio/SoundFileReaderOgg.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileReaderWav.cpp b/extern/sfml/src/SFML/Audio/SoundFileReaderWav.cpp index df9dab9..8407516 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileReaderWav.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileReaderWav.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileReaderWav.hpp b/extern/sfml/src/SFML/Audio/SoundFileReaderWav.hpp index 04e3a10..d8b1c1a 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileReaderWav.hpp +++ b/extern/sfml/src/SFML/Audio/SoundFileReaderWav.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.cpp b/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.cpp index ddd3c20..3c8ca83 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -39,7 +39,7 @@ namespace priv //////////////////////////////////////////////////////////// bool SoundFileWriterFlac::check(const std::string& filename) { - std::string extension = filename.substr(filename.find_last_of(".") + 1); + std::string extension = filename.substr(filename.find_last_of('.') + 1); std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); return extension == "flac"; diff --git a/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.hpp b/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.hpp index d54975e..2bd175d 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.hpp +++ b/extern/sfml/src/SFML/Audio/SoundFileWriterFlac.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.cpp b/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.cpp index c56847e..7fec8c0 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -40,7 +40,7 @@ namespace priv //////////////////////////////////////////////////////////// bool SoundFileWriterOgg::check(const std::string& filename) { - std::string extension = filename.substr(filename.find_last_of(".") + 1); + std::string extension = filename.substr(filename.find_last_of('.') + 1); std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); return extension == "ogg"; diff --git a/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.hpp b/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.hpp index 7a482d1..602e8d3 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.hpp +++ b/extern/sfml/src/SFML/Audio/SoundFileWriterOgg.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundFileWriterWav.cpp b/extern/sfml/src/SFML/Audio/SoundFileWriterWav.cpp index 4f82d5e..781c76a 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileWriterWav.cpp +++ b/extern/sfml/src/SFML/Audio/SoundFileWriterWav.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -77,7 +77,7 @@ namespace priv //////////////////////////////////////////////////////////// bool SoundFileWriterWav::check(const std::string& filename) { - std::string extension = filename.substr(filename.find_last_of(".") + 1); + std::string extension = filename.substr(filename.find_last_of('.') + 1); std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); return extension == "wav"; diff --git a/extern/sfml/src/SFML/Audio/SoundFileWriterWav.hpp b/extern/sfml/src/SFML/Audio/SoundFileWriterWav.hpp index 58d1684..a70efa8 100644 --- a/extern/sfml/src/SFML/Audio/SoundFileWriterWav.hpp +++ b/extern/sfml/src/SFML/Audio/SoundFileWriterWav.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundRecorder.cpp b/extern/sfml/src/SFML/Audio/SoundRecorder.cpp index 1066b45..05b1323 100644 --- a/extern/sfml/src/SFML/Audio/SoundRecorder.cpp +++ b/extern/sfml/src/SFML/Audio/SoundRecorder.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundSource.cpp b/extern/sfml/src/SFML/Audio/SoundSource.cpp index 7bc6b3a..6876f7b 100644 --- a/extern/sfml/src/SFML/Audio/SoundSource.cpp +++ b/extern/sfml/src/SFML/Audio/SoundSource.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Audio/SoundStream.cpp b/extern/sfml/src/SFML/Audio/SoundStream.cpp index b4172a2..76d069f 100644 --- a/extern/sfml/src/SFML/Audio/SoundStream.cpp +++ b/extern/sfml/src/SFML/Audio/SoundStream.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/BlendMode.cpp b/extern/sfml/src/SFML/Graphics/BlendMode.cpp index 7897247..292a346 100644 --- a/extern/sfml/src/SFML/Graphics/BlendMode.cpp +++ b/extern/sfml/src/SFML/Graphics/BlendMode.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -37,8 +37,10 @@ const BlendMode BlendAlpha(BlendMode::SrcAlpha, BlendMode::OneMinusSrcAlpha, Ble BlendMode::One, BlendMode::OneMinusSrcAlpha, BlendMode::Add); const BlendMode BlendAdd(BlendMode::SrcAlpha, BlendMode::One, BlendMode::Add, BlendMode::One, BlendMode::One, BlendMode::Add); -const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero); -const BlendMode BlendNone(BlendMode::One, BlendMode::Zero); +const BlendMode BlendMultiply(BlendMode::DstColor, BlendMode::Zero, BlendMode::Add); +const BlendMode BlendMin(BlendMode::One, BlendMode::One, BlendMode::Min); +const BlendMode BlendMax(BlendMode::One, BlendMode::One, BlendMode::Max); +const BlendMode BlendNone(BlendMode::One, BlendMode::Zero, BlendMode::Add); //////////////////////////////////////////////////////////// diff --git a/extern/sfml/src/SFML/Graphics/CMakeLists.txt b/extern/sfml/src/SFML/Graphics/CMakeLists.txt index 14c48ea..139703c 100644 --- a/extern/sfml/src/SFML/Graphics/CMakeLists.txt +++ b/extern/sfml/src/SFML/Graphics/CMakeLists.txt @@ -117,6 +117,12 @@ elseif(SFML_OS_IOS) target_link_libraries(sfml-graphics PRIVATE z bz2) endif() +# starting from Visual Studio 2015, inline versions of some C functions are used; for compatibility link this library +# see https://docs.microsoft.com/en-us/cpp/porting/overview-of-potential-upgrade-issues-visual-cpp?view=msvc-160#libraries +if(SFML_COMPILER_MSVC AND MSVC_VERSION GREATER_EQUAL 1900) + target_link_libraries(sfml-graphics PRIVATE legacy_stdio_definitions.lib) +endif() + sfml_find_package(Freetype INCLUDE "FREETYPE_INCLUDE_DIRS" LINK "FREETYPE_LIBRARY") target_link_libraries(sfml-graphics PRIVATE Freetype) diff --git a/extern/sfml/src/SFML/Graphics/CircleShape.cpp b/extern/sfml/src/SFML/Graphics/CircleShape.cpp index 8c70f62..7281467 100644 --- a/extern/sfml/src/SFML/Graphics/CircleShape.cpp +++ b/extern/sfml/src/SFML/Graphics/CircleShape.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Color.cpp b/extern/sfml/src/SFML/Graphics/Color.cpp index b0bb687..1dcc46d 100644 --- a/extern/sfml/src/SFML/Graphics/Color.cpp +++ b/extern/sfml/src/SFML/Graphics/Color.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/ConvexShape.cpp b/extern/sfml/src/SFML/Graphics/ConvexShape.cpp index fa5da83..cd8df01 100644 --- a/extern/sfml/src/SFML/Graphics/ConvexShape.cpp +++ b/extern/sfml/src/SFML/Graphics/ConvexShape.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Font.cpp b/extern/sfml/src/SFML/Graphics/Font.cpp index ddc9d36..a749041 100644 --- a/extern/sfml/src/SFML/Graphics/Font.cpp +++ b/extern/sfml/src/SFML/Graphics/Font.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -40,6 +40,7 @@ #include FT_STROKER_H #include #include +#include namespace @@ -375,7 +376,7 @@ bool Font::hasGlyph(Uint32 codePoint) const //////////////////////////////////////////////////////////// -float Font::getKerning(Uint32 first, Uint32 second, unsigned int characterSize) const +float Font::getKerning(Uint32 first, Uint32 second, unsigned int characterSize, bool bold) const { // Special case where first or second is 0 (null character) if (first == 0 || second == 0) @@ -383,26 +384,33 @@ float Font::getKerning(Uint32 first, Uint32 second, unsigned int characterSize) FT_Face face = static_cast(m_face); - if (face && FT_HAS_KERNING(face) && setCurrentSize(characterSize)) + if (face && setCurrentSize(characterSize)) { // Convert the characters to indices FT_UInt index1 = FT_Get_Char_Index(face, first); FT_UInt index2 = FT_Get_Char_Index(face, second); - // Get the kerning vector + // Retrieve position compensation deltas generated by FT_LOAD_FORCE_AUTOHINT flag + float firstRsbDelta = getGlyph(first, characterSize, bold).rsbDelta; + float secondLsbDelta = getGlyph(second, characterSize, bold).lsbDelta; + + // Get the kerning vector if present FT_Vector kerning; - FT_Get_Kerning(face, index1, index2, FT_KERNING_DEFAULT, &kerning); + kerning.x = kerning.y = 0; + if (FT_HAS_KERNING(face)) + FT_Get_Kerning(face, index1, index2, FT_KERNING_UNFITTED, &kerning); // X advance is already in pixels for bitmap fonts if (!FT_IS_SCALABLE(face)) return static_cast(kerning.x); - // Return the X advance - return static_cast(kerning.x) / static_cast(1 << 6); + // Combine kerning with compensation deltas and return the X advance + // Flooring is required as we use FT_KERNING_UNFITTED flag which is not quantized in 64 based grid + return std::floor((secondLsbDelta - firstRsbDelta + static_cast(kerning.x) + 32) / static_cast(1 << 6)); } else { - // Invalid font, or no kerning + // Invalid font return 0.f; } } @@ -624,6 +632,9 @@ Glyph Font::loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, f if (bold) glyph.advance += static_cast(weight) / static_cast(1 << 6); + glyph.lsbDelta = face->glyph->lsb_delta; + glyph.rsbDelta = face->glyph->rsb_delta; + int width = bitmap.width; int height = bitmap.rows; diff --git a/extern/sfml/src/SFML/Graphics/GLCheck.cpp b/extern/sfml/src/SFML/Graphics/GLCheck.cpp index e908eaa..6911db5 100644 --- a/extern/sfml/src/SFML/Graphics/GLCheck.cpp +++ b/extern/sfml/src/SFML/Graphics/GLCheck.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/GLCheck.hpp b/extern/sfml/src/SFML/Graphics/GLCheck.hpp index c1bcaea..b002826 100644 --- a/extern/sfml/src/SFML/Graphics/GLCheck.hpp +++ b/extern/sfml/src/SFML/Graphics/GLCheck.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/GLExtensions.cpp b/extern/sfml/src/SFML/Graphics/GLExtensions.cpp index 109fe3a..5ec9236 100644 --- a/extern/sfml/src/SFML/Graphics/GLExtensions.cpp +++ b/extern/sfml/src/SFML/Graphics/GLExtensions.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/GLExtensions.hpp b/extern/sfml/src/SFML/Graphics/GLExtensions.hpp index ec0391d..dc12187 100644 --- a/extern/sfml/src/SFML/Graphics/GLExtensions.hpp +++ b/extern/sfml/src/SFML/Graphics/GLExtensions.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -45,7 +45,6 @@ #define GLEXT_multitexture true #define GLEXT_texture_edge_clamp true #define GLEXT_EXT_texture_edge_clamp true - #define GLEXT_blend_minmax true #define GLEXT_glClientActiveTexture glClientActiveTexture #define GLEXT_glActiveTexture glActiveTexture #define GLEXT_GL_TEXTURE0 GL_TEXTURE0 @@ -140,6 +139,11 @@ #define GLEXT_texture_sRGB false #define GLEXT_GL_SRGB8_ALPHA8 0 + // Core since 3.0 - EXT_blend_minmax + #define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax + #define GLEXT_GL_MIN GL_MIN_EXT + #define GLEXT_GL_MAX GL_MAX_EXT + #else // SFML requires at a bare minimum OpenGL 1.1 capability @@ -164,6 +168,8 @@ #define GLEXT_blend_minmax SF_GLAD_GL_EXT_blend_minmax #define GLEXT_glBlendEquation glBlendEquationEXT #define GLEXT_GL_FUNC_ADD GL_FUNC_ADD_EXT + #define GLEXT_GL_MIN GL_MIN_EXT + #define GLEXT_GL_MAX GL_MAX_EXT // Core since 1.2 - EXT_blend_subtract #define GLEXT_blend_subtract SF_GLAD_GL_EXT_blend_subtract @@ -302,6 +308,27 @@ #define GLEXT_geometry_shader4 SF_GLAD_GL_ARB_geometry_shader4 #define GLEXT_GL_GEOMETRY_SHADER GL_GEOMETRY_SHADER_ARB + // OpenGL Versions + #define GLEXT_GL_VERSION_1_0 SF_GLAD_GL_VERSION_1_0 + #define GLEXT_GL_VERSION_1_1 SF_GLAD_GL_VERSION_1_1 + #define GLEXT_GL_VERSION_1_2 SF_GLAD_GL_VERSION_1_2 + #define GLEXT_GL_VERSION_1_3 SF_GLAD_GL_VERSION_1_3 + #define GLEXT_GL_VERSION_1_4 SF_GLAD_GL_VERSION_1_4 + #define GLEXT_GL_VERSION_1_5 SF_GLAD_GL_VERSION_1_5 + #define GLEXT_GL_VERSION_2_0 SF_GLAD_GL_VERSION_2_0 + #define GLEXT_GL_VERSION_2_1 SF_GLAD_GL_VERSION_2_1 + #define GLEXT_GL_VERSION_3_0 SF_GLAD_GL_VERSION_3_0 + #define GLEXT_GL_VERSION_3_1 SF_GLAD_GL_VERSION_3_1 + #define GLEXT_GL_VERSION_3_2 SF_GLAD_GL_VERSION_3_2 + #define GLEXT_GL_VERSION_3_3 SF_GLAD_GL_VERSION_3_3 + #define GLEXT_GL_VERSION_4_0 SF_GLAD_GL_VERSION_4_0 + #define GLEXT_GL_VERSION_4_1 SF_GLAD_GL_VERSION_4_1 + #define GLEXT_GL_VERSION_4_2 SF_GLAD_GL_VERSION_4_2 + #define GLEXT_GL_VERSION_4_3 SF_GLAD_GL_VERSION_4_3 + #define GLEXT_GL_VERSION_4_4 SF_GLAD_GL_VERSION_4_4 + #define GLEXT_GL_VERSION_4_5 SF_GLAD_GL_VERSION_4_5 + #define GLEXT_GL_VERSION_4_6 SF_GLAD_GL_VERSION_4_6 + #endif namespace sf diff --git a/extern/sfml/src/SFML/Graphics/Glsl.cpp b/extern/sfml/src/SFML/Graphics/Glsl.cpp index 557dc9b..c25e99d 100644 --- a/extern/sfml/src/SFML/Graphics/Glsl.cpp +++ b/extern/sfml/src/SFML/Graphics/Glsl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Image.cpp b/extern/sfml/src/SFML/Graphics/Image.cpp index bb791d6..089ff82 100644 --- a/extern/sfml/src/SFML/Graphics/Image.cpp +++ b/extern/sfml/src/SFML/Graphics/Image.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -153,6 +153,12 @@ bool Image::saveToFile(const std::string& filename) const return priv::ImageLoader::getInstance().saveImageToFile(filename, m_pixels, m_size); } +//////////////////////////////////////////////////////////// +bool Image::saveToMemory(std::vector& output, const std::string& format) const +{ + return priv::ImageLoader::getInstance().saveImageToMemory(format, output, m_pixels, m_size); +} + //////////////////////////////////////////////////////////// Vector2u Image::getSize() const diff --git a/extern/sfml/src/SFML/Graphics/ImageLoader.cpp b/extern/sfml/src/SFML/Graphics/ImageLoader.cpp index d0e7ac9..93113fb 100644 --- a/extern/sfml/src/SFML/Graphics/ImageLoader.cpp +++ b/extern/sfml/src/SFML/Graphics/ImageLoader.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -33,6 +33,7 @@ #define STB_IMAGE_WRITE_IMPLEMENTATION #include #include +#include namespace @@ -61,6 +62,14 @@ namespace sf::InputStream* stream = static_cast(user); return stream->tell() >= stream->getSize(); } + + // stb_image callback for constructing a buffer + void bufferFromCallback(void* context, void* data, int size) + { + sf::Uint8* source = static_cast(data); + std::vector* dest = static_cast*>(context); + std::copy(source, source + size, std::back_inserter(*dest)); + } } @@ -272,6 +281,46 @@ bool ImageLoader::saveImageToFile(const std::string& filename, const std::vector return false; } +//////////////////////////////////////////////////////////// +bool ImageLoader::saveImageToMemory(const std::string& format, std::vector& output, const std::vector& pixels, const Vector2u& size) +{ + // Make sure the image is not empty + if (!pixels.empty() && (size.x > 0) && (size.y > 0)) + { + // Choose function based on format + + std::string specified = toLower(format); + + if (specified == "bmp") + { + // BMP format + if (stbi_write_bmp_to_func(&bufferFromCallback, &output, size.x, size.y, 4, &pixels[0])) + return true; + } + else if (specified == "tga") + { + // TGA format + if (stbi_write_tga_to_func(&bufferFromCallback, &output, size.x, size.y, 4, &pixels[0])) + return true; + } + else if (specified == "png") + { + // PNG format + if (stbi_write_png_to_func(&bufferFromCallback, &output, size.x, size.y, 4, &pixels[0], 0)) + return true; + } + else if (specified == "jpg" || specified == "jpeg") + { + // JPG format + if (stbi_write_jpg_to_func(&bufferFromCallback, &output, size.x, size.y, 4, &pixels[0], 90)) + return true; + } + } + + err() << "Failed to save image with format \"" << format << "\"" << std::endl; + return false; +} + } // namespace priv } // namespace sf diff --git a/extern/sfml/src/SFML/Graphics/ImageLoader.hpp b/extern/sfml/src/SFML/Graphics/ImageLoader.hpp index c178cb7..9db970b 100644 --- a/extern/sfml/src/SFML/Graphics/ImageLoader.hpp +++ b/extern/sfml/src/SFML/Graphics/ImageLoader.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -105,6 +105,19 @@ class ImageLoader : NonCopyable //////////////////////////////////////////////////////////// bool saveImageToFile(const std::string& filename, const std::vector& pixels, const Vector2u& size); + //////////////////////////////////////////////////////////// + /// \brief Save an array of pixels as an encoded image buffer + /// + /// \param format Must be "bmp", "png", "tga" or "jpg"/"jpeg". + /// \param output Buffer to fill with encoded data + /// \param pixels Array of pixels to save to image + /// \param size Size of image to save, in pixels + /// + /// \return True if saving was successful + /// + //////////////////////////////////////////////////////////// + bool saveImageToMemory(const std::string& format, std::vector& output, const std::vector& pixels, const Vector2u& size); + private: //////////////////////////////////////////////////////////// diff --git a/extern/sfml/src/SFML/Graphics/RectangleShape.cpp b/extern/sfml/src/SFML/Graphics/RectangleShape.cpp index 66569ba..49af488 100644 --- a/extern/sfml/src/SFML/Graphics/RectangleShape.cpp +++ b/extern/sfml/src/SFML/Graphics/RectangleShape.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderStates.cpp b/extern/sfml/src/SFML/Graphics/RenderStates.cpp index fff6f08..ae4a56d 100644 --- a/extern/sfml/src/SFML/Graphics/RenderStates.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderStates.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTarget.cpp b/extern/sfml/src/SFML/Graphics/RenderTarget.cpp index 5b0dbd3..4576946 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTarget.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderTarget.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -110,13 +110,36 @@ namespace { switch (blendEquation) { - case sf::BlendMode::Add: return GLEXT_GL_FUNC_ADD; - case sf::BlendMode::Subtract: return GLEXT_GL_FUNC_SUBTRACT; - case sf::BlendMode::ReverseSubtract: return GLEXT_GL_FUNC_REVERSE_SUBTRACT; + case sf::BlendMode::Add: + return GLEXT_GL_FUNC_ADD; + case sf::BlendMode::Subtract: + if (GLEXT_blend_subtract) + return GLEXT_GL_FUNC_SUBTRACT; + break; + case sf::BlendMode::ReverseSubtract: + if (GLEXT_blend_subtract) + return GLEXT_GL_FUNC_REVERSE_SUBTRACT; + break; + case sf::BlendMode::Min: + if (GLEXT_blend_minmax) + return GLEXT_GL_MIN; + break; + case sf::BlendMode::Max: + if (GLEXT_blend_minmax) + return GLEXT_GL_MAX; + break; + } + + static bool warned = false; + if (!warned) + { + sf::err() << "OpenGL extension EXT_blend_minmax or EXT_blend_subtract unavailable" << std::endl; + sf::err() << "Some blending equations will fallback to sf::BlendMode::Add" << std::endl; + sf::err() << "Ensure that hardware acceleration is enabled if available" << std::endl; + + warned = true; } - sf::err() << "Invalid value for sf::BlendMode::Equation! Fallback to sf::BlendMode::Add." << std::endl; - assert(false); return GLEXT_GL_FUNC_ADD; } } @@ -591,7 +614,7 @@ void RenderTarget::applyBlendMode(const BlendMode& mode) factorToGlConstant(mode.colorDstFactor))); } - if (GLEXT_blend_minmax && GLEXT_blend_subtract) + if (GLEXT_blend_minmax || GLEXT_blend_subtract) { if (GLEXT_blend_equation_separate) { @@ -610,7 +633,11 @@ void RenderTarget::applyBlendMode(const BlendMode& mode) if (!warned) { - err() << "OpenGL extension EXT_blend_minmax and/or EXT_blend_subtract unavailable" << std::endl; +#ifdef SFML_OPENGL_ES + err() << "OpenGL ES extension OES_blend_subtract unavailable" << std::endl; +#else + err() << "OpenGL extension EXT_blend_minmax and EXT_blend_subtract unavailable" << std::endl; +#endif err() << "Selecting a blend equation not possible" << std::endl; err() << "Ensure that hardware acceleration is enabled if available" << std::endl; diff --git a/extern/sfml/src/SFML/Graphics/RenderTexture.cpp b/extern/sfml/src/SFML/Graphics/RenderTexture.cpp index 9daad7a..fc33c1d 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTexture.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderTexture.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTextureImpl.cpp b/extern/sfml/src/SFML/Graphics/RenderTextureImpl.cpp index e766dd9..59b267c 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTextureImpl.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderTextureImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTextureImpl.hpp b/extern/sfml/src/SFML/Graphics/RenderTextureImpl.hpp index 22b1c54..47e6ca5 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTextureImpl.hpp +++ b/extern/sfml/src/SFML/Graphics/RenderTextureImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.cpp b/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.cpp index a0cac97..d2555ea 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.hpp b/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.hpp index 97e3b29..5cdd65e 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.hpp +++ b/extern/sfml/src/SFML/Graphics/RenderTextureImplDefault.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.cpp b/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.cpp index 45eb2a9..432208f 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.hpp b/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.hpp index 7fcf6ef..55a9b7c 100644 --- a/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.hpp +++ b/extern/sfml/src/SFML/Graphics/RenderTextureImplFBO.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/RenderWindow.cpp b/extern/sfml/src/SFML/Graphics/RenderWindow.cpp index d26a5f3..9a98836 100644 --- a/extern/sfml/src/SFML/Graphics/RenderWindow.cpp +++ b/extern/sfml/src/SFML/Graphics/RenderWindow.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Shader.cpp b/extern/sfml/src/SFML/Graphics/Shader.cpp index cbfc4d2..ce1be3b 100644 --- a/extern/sfml/src/SFML/Graphics/Shader.cpp +++ b/extern/sfml/src/SFML/Graphics/Shader.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -815,7 +815,7 @@ bool Shader::isGeometryAvailable() // Make sure that extensions are initialized sf::priv::ensureExtensionsInit(); - available = isAvailable() && GLEXT_geometry_shader4; + available = isAvailable() && (GLEXT_geometry_shader4 || GLEXT_GL_VERSION_3_2); } return available; diff --git a/extern/sfml/src/SFML/Graphics/Shape.cpp b/extern/sfml/src/SFML/Graphics/Shape.cpp index 5767030..ccf3ddf 100644 --- a/extern/sfml/src/SFML/Graphics/Shape.cpp +++ b/extern/sfml/src/SFML/Graphics/Shape.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Sprite.cpp b/extern/sfml/src/SFML/Graphics/Sprite.cpp index f32dc48..6a23258 100644 --- a/extern/sfml/src/SFML/Graphics/Sprite.cpp +++ b/extern/sfml/src/SFML/Graphics/Sprite.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -46,7 +46,7 @@ Sprite::Sprite(const Texture& texture) : m_texture (NULL), m_textureRect() { - setTexture(texture); + setTexture(texture, true); } @@ -55,8 +55,10 @@ Sprite::Sprite(const Texture& texture, const IntRect& rectangle) : m_texture (NULL), m_textureRect() { - setTexture(texture); + // Compute the texture area setTextureRect(rectangle); + // Assign texture + setTexture(texture, false); } @@ -65,7 +67,10 @@ void Sprite::setTexture(const Texture& texture, bool resetRect) { // Recompute the texture area if requested, or if there was no valid texture & rect before if (resetRect || (!m_texture && (m_textureRect == sf::IntRect()))) - setTextureRect(IntRect(0, 0, texture.getSize().x, texture.getSize().y)); + { + Vector2u size = texture.getSize(); + setTextureRect(IntRect(0, 0, size.x, size.y)); + } // Assign the new texture m_texture = &texture; diff --git a/extern/sfml/src/SFML/Graphics/Text.cpp b/extern/sfml/src/SFML/Graphics/Text.cpp index 2ba7d46..eb2600c 100644 --- a/extern/sfml/src/SFML/Graphics/Text.cpp +++ b/extern/sfml/src/SFML/Graphics/Text.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -332,7 +332,7 @@ Vector2f Text::findCharacterPos(std::size_t index) const Uint32 curChar = m_string[i]; // Apply the kerning offset - position.x += m_font->getKerning(prevChar, curChar, m_characterSize); + position.x += m_font->getKerning(prevChar, curChar, m_characterSize, isBold); prevChar = curChar; // Handle special characters @@ -451,7 +451,7 @@ void Text::ensureGeometryUpdate() const continue; // Apply the kerning offset - x += m_font->getKerning(prevChar, curChar, m_characterSize); + x += m_font->getKerning(prevChar, curChar, m_characterSize, isBold); // If we're using the underlined style and there's a new line, draw a line if (isUnderlined && (curChar == L'\n' && prevChar != L'\n')) diff --git a/extern/sfml/src/SFML/Graphics/Texture.cpp b/extern/sfml/src/SFML/Graphics/Texture.cpp index ef731a6..a2f157a 100644 --- a/extern/sfml/src/SFML/Graphics/Texture.cpp +++ b/extern/sfml/src/SFML/Graphics/Texture.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/TextureSaver.cpp b/extern/sfml/src/SFML/Graphics/TextureSaver.cpp index 7ffbc0b..b5b10f5 100644 --- a/extern/sfml/src/SFML/Graphics/TextureSaver.cpp +++ b/extern/sfml/src/SFML/Graphics/TextureSaver.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/TextureSaver.hpp b/extern/sfml/src/SFML/Graphics/TextureSaver.hpp index 560c2fc..b191857 100644 --- a/extern/sfml/src/SFML/Graphics/TextureSaver.hpp +++ b/extern/sfml/src/SFML/Graphics/TextureSaver.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Transform.cpp b/extern/sfml/src/SFML/Graphics/Transform.cpp index 9a6706c..3d5017c 100644 --- a/extern/sfml/src/SFML/Graphics/Transform.cpp +++ b/extern/sfml/src/SFML/Graphics/Transform.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Transformable.cpp b/extern/sfml/src/SFML/Graphics/Transformable.cpp index 6a8f073..f1b1144 100644 --- a/extern/sfml/src/SFML/Graphics/Transformable.cpp +++ b/extern/sfml/src/SFML/Graphics/Transformable.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/Vertex.cpp b/extern/sfml/src/SFML/Graphics/Vertex.cpp index 801af44..2b06609 100644 --- a/extern/sfml/src/SFML/Graphics/Vertex.cpp +++ b/extern/sfml/src/SFML/Graphics/Vertex.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/VertexArray.cpp b/extern/sfml/src/SFML/Graphics/VertexArray.cpp index 9be9d7d..c571695 100644 --- a/extern/sfml/src/SFML/Graphics/VertexArray.cpp +++ b/extern/sfml/src/SFML/Graphics/VertexArray.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/VertexBuffer.cpp b/extern/sfml/src/SFML/Graphics/VertexBuffer.cpp index 2b3166a..18a9b70 100644 --- a/extern/sfml/src/SFML/Graphics/VertexBuffer.cpp +++ b/extern/sfml/src/SFML/Graphics/VertexBuffer.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Graphics/View.cpp b/extern/sfml/src/SFML/Graphics/View.cpp index 048f313..5a77b93 100644 --- a/extern/sfml/src/SFML/Graphics/View.cpp +++ b/extern/sfml/src/SFML/Graphics/View.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Main/MainAndroid.cpp b/extern/sfml/src/SFML/Main/MainAndroid.cpp index daf6dac..f1e315b 100644 --- a/extern/sfml/src/SFML/Main/MainAndroid.cpp +++ b/extern/sfml/src/SFML/Main/MainAndroid.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -492,6 +492,7 @@ JNIEXPORT void ANativeActivity_onCreate(ANativeActivity* activity, void* savedSt for (unsigned int i = 0; i < sf::Mouse::ButtonCount; i++) states->isButtonPressed[i] = false; + gladLoaderLoadEGL(EGL_DEFAULT_DISPLAY); states->display = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (savedState != NULL) diff --git a/extern/sfml/src/SFML/Main/MainWin32.cpp b/extern/sfml/src/SFML/Main/MainWin32.cpp index 6a38202..93a9a52 100644 --- a/extern/sfml/src/SFML/Main/MainWin32.cpp +++ b/extern/sfml/src/SFML/Main/MainWin32.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // Copyright (C) 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Main/MainiOS.mm b/extern/sfml/src/SFML/Main/MainiOS.mm index 534db33..49f5b37 100644 --- a/extern/sfml/src/SFML/Main/MainiOS.mm +++ b/extern/sfml/src/SFML/Main/MainiOS.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.prg) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.prg) // Copyright (C) 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Network/Ftp.cpp b/extern/sfml/src/SFML/Network/Ftp.cpp index 6b5ebce..78df4eb 100644 --- a/extern/sfml/src/SFML/Network/Ftp.cpp +++ b/extern/sfml/src/SFML/Network/Ftp.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -366,7 +366,7 @@ Ftp::Response Ftp::sendCommand(const std::string& command, const std::string& pa { // Build the command string std::string commandStr; - if (parameter != "") + if (!parameter.empty()) commandStr = command + " " + parameter + "\r\n"; else commandStr = command + "\r\n"; diff --git a/extern/sfml/src/SFML/Network/Http.cpp b/extern/sfml/src/SFML/Network/Http.cpp index 40a5167..aa7e58f 100644 --- a/extern/sfml/src/SFML/Network/Http.cpp +++ b/extern/sfml/src/SFML/Network/Http.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -327,7 +327,7 @@ void Http::setHost(const std::string& host, unsigned short port) { // HTTPS protocol -- unsupported (requires encryption and certificates and stuff...) err() << "HTTPS protocol is not supported by sf::Http" << std::endl; - m_hostName = ""; + m_hostName.clear(); m_port = 0; } else diff --git a/extern/sfml/src/SFML/Network/IpAddress.cpp b/extern/sfml/src/SFML/Network/IpAddress.cpp index 067c7ae..0f0e9fb 100644 --- a/extern/sfml/src/SFML/Network/IpAddress.cpp +++ b/extern/sfml/src/SFML/Network/IpAddress.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/Packet.cpp b/extern/sfml/src/SFML/Network/Packet.cpp index 951c4bd..3b638d4 100644 --- a/extern/sfml/src/SFML/Network/Packet.cpp +++ b/extern/sfml/src/SFML/Network/Packet.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -123,7 +123,7 @@ Packet& Packet::operator >>(Int8& data) { if (checkSize(sizeof(data))) { - data = *reinterpret_cast(&m_data[m_readPos]); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); m_readPos += sizeof(data); } @@ -136,7 +136,7 @@ Packet& Packet::operator >>(Uint8& data) { if (checkSize(sizeof(data))) { - data = *reinterpret_cast(&m_data[m_readPos]); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); m_readPos += sizeof(data); } @@ -149,7 +149,8 @@ Packet& Packet::operator >>(Int16& data) { if (checkSize(sizeof(data))) { - data = ntohs(*reinterpret_cast(&m_data[m_readPos])); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); + data = ntohs(data); m_readPos += sizeof(data); } @@ -162,7 +163,8 @@ Packet& Packet::operator >>(Uint16& data) { if (checkSize(sizeof(data))) { - data = ntohs(*reinterpret_cast(&m_data[m_readPos])); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); + data = ntohs(data); m_readPos += sizeof(data); } @@ -175,7 +177,8 @@ Packet& Packet::operator >>(Int32& data) { if (checkSize(sizeof(data))) { - data = ntohl(*reinterpret_cast(&m_data[m_readPos])); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); + data = ntohl(data); m_readPos += sizeof(data); } @@ -188,7 +191,8 @@ Packet& Packet::operator >>(Uint32& data) { if (checkSize(sizeof(data))) { - data = ntohl(*reinterpret_cast(&m_data[m_readPos])); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); + data = ntohl(data); m_readPos += sizeof(data); } @@ -203,7 +207,8 @@ Packet& Packet::operator >>(Int64& data) { // Since ntohll is not available everywhere, we have to convert // to network byte order (big endian) manually - const Uint8* bytes = reinterpret_cast(&m_data[m_readPos]); + Uint8 bytes[sizeof(data)]; + std::memcpy(bytes, &m_data[m_readPos], sizeof(data)); data = (static_cast(bytes[0]) << 56) | (static_cast(bytes[1]) << 48) | (static_cast(bytes[2]) << 40) | @@ -226,7 +231,8 @@ Packet& Packet::operator >>(Uint64& data) { // Since ntohll is not available everywhere, we have to convert // to network byte order (big endian) manually - const Uint8* bytes = reinterpret_cast(&m_data[m_readPos]); + Uint8 bytes[sizeof(data)]; + std::memcpy(bytes, &m_data[m_readPos], sizeof(data)); data = (static_cast(bytes[0]) << 56) | (static_cast(bytes[1]) << 48) | (static_cast(bytes[2]) << 40) | @@ -247,7 +253,7 @@ Packet& Packet::operator >>(float& data) { if (checkSize(sizeof(data))) { - data = *reinterpret_cast(&m_data[m_readPos]); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); m_readPos += sizeof(data); } @@ -260,7 +266,7 @@ Packet& Packet::operator >>(double& data) { if (checkSize(sizeof(data))) { - data = *reinterpret_cast(&m_data[m_readPos]); + std::memcpy(&data, &m_data[m_readPos], sizeof(data)); m_readPos += sizeof(data); } diff --git a/extern/sfml/src/SFML/Network/Socket.cpp b/extern/sfml/src/SFML/Network/Socket.cpp index 622f9d4..07c52d5 100644 --- a/extern/sfml/src/SFML/Network/Socket.cpp +++ b/extern/sfml/src/SFML/Network/Socket.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/SocketImpl.hpp b/extern/sfml/src/SFML/Network/SocketImpl.hpp index c958099..d37e5fd 100644 --- a/extern/sfml/src/SFML/Network/SocketImpl.hpp +++ b/extern/sfml/src/SFML/Network/SocketImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/SocketSelector.cpp b/extern/sfml/src/SFML/Network/SocketSelector.cpp index 465e0a7..47fe597 100644 --- a/extern/sfml/src/SFML/Network/SocketSelector.cpp +++ b/extern/sfml/src/SFML/Network/SocketSelector.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/TcpListener.cpp b/extern/sfml/src/SFML/Network/TcpListener.cpp index 38749d5..d7517d3 100644 --- a/extern/sfml/src/SFML/Network/TcpListener.cpp +++ b/extern/sfml/src/SFML/Network/TcpListener.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/TcpSocket.cpp b/extern/sfml/src/SFML/Network/TcpSocket.cpp index 8333b95..3205f80 100644 --- a/extern/sfml/src/SFML/Network/TcpSocket.cpp +++ b/extern/sfml/src/SFML/Network/TcpSocket.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/UdpSocket.cpp b/extern/sfml/src/SFML/Network/UdpSocket.cpp index 3e19391..a161823 100644 --- a/extern/sfml/src/SFML/Network/UdpSocket.cpp +++ b/extern/sfml/src/SFML/Network/UdpSocket.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/Unix/SocketImpl.cpp b/extern/sfml/src/SFML/Network/Unix/SocketImpl.cpp index 5f59171..d9b2366 100644 --- a/extern/sfml/src/SFML/Network/Unix/SocketImpl.cpp +++ b/extern/sfml/src/SFML/Network/Unix/SocketImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/Unix/SocketImpl.hpp b/extern/sfml/src/SFML/Network/Unix/SocketImpl.hpp index 3de9233..5e3742a 100644 --- a/extern/sfml/src/SFML/Network/Unix/SocketImpl.hpp +++ b/extern/sfml/src/SFML/Network/Unix/SocketImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/Win32/SocketImpl.cpp b/extern/sfml/src/SFML/Network/Win32/SocketImpl.cpp index b369e18..cd2580a 100644 --- a/extern/sfml/src/SFML/Network/Win32/SocketImpl.cpp +++ b/extern/sfml/src/SFML/Network/Win32/SocketImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Network/Win32/SocketImpl.hpp b/extern/sfml/src/SFML/Network/Win32/SocketImpl.hpp index 8255754..7812111 100644 --- a/extern/sfml/src/SFML/Network/Win32/SocketImpl.hpp +++ b/extern/sfml/src/SFML/Network/Win32/SocketImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Android/Activity.cpp b/extern/sfml/src/SFML/System/Android/Activity.cpp index 11dfaeb..66c3341 100644 --- a/extern/sfml/src/SFML/System/Android/Activity.cpp +++ b/extern/sfml/src/SFML/System/Android/Activity.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // Copyright (C) 2013 Jonathan De Wachter (dewachter.jonathan@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/System/Android/NativeActivity.cpp b/extern/sfml/src/SFML/System/Android/NativeActivity.cpp index ee01eed..1d4efaa 100644 --- a/extern/sfml/src/SFML/System/Android/NativeActivity.cpp +++ b/extern/sfml/src/SFML/System/Android/NativeActivity.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Clock.cpp b/extern/sfml/src/SFML/System/Clock.cpp index 8e4aca0..5e3ec47 100644 --- a/extern/sfml/src/SFML/System/Clock.cpp +++ b/extern/sfml/src/SFML/System/Clock.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Err.cpp b/extern/sfml/src/SFML/System/Err.cpp index 1e8a846..377da23 100644 --- a/extern/sfml/src/SFML/System/Err.cpp +++ b/extern/sfml/src/SFML/System/Err.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/FileInputStream.cpp b/extern/sfml/src/SFML/System/FileInputStream.cpp index bab93f5..f2d8539 100644 --- a/extern/sfml/src/SFML/System/FileInputStream.cpp +++ b/extern/sfml/src/SFML/System/FileInputStream.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Lock.cpp b/extern/sfml/src/SFML/System/Lock.cpp index b4084b0..b3f905c 100644 --- a/extern/sfml/src/SFML/System/Lock.cpp +++ b/extern/sfml/src/SFML/System/Lock.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/MemoryInputStream.cpp b/extern/sfml/src/SFML/System/MemoryInputStream.cpp index 6b849a9..f81e1a0 100644 --- a/extern/sfml/src/SFML/System/MemoryInputStream.cpp +++ b/extern/sfml/src/SFML/System/MemoryInputStream.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Mutex.cpp b/extern/sfml/src/SFML/System/Mutex.cpp index 21a86e4..fb392f1 100644 --- a/extern/sfml/src/SFML/System/Mutex.cpp +++ b/extern/sfml/src/SFML/System/Mutex.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Sleep.cpp b/extern/sfml/src/SFML/System/Sleep.cpp index 3d1beca..639df93 100644 --- a/extern/sfml/src/SFML/System/Sleep.cpp +++ b/extern/sfml/src/SFML/System/Sleep.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/String.cpp b/extern/sfml/src/SFML/System/String.cpp index 92d8ec2..19ed3ba 100644 --- a/extern/sfml/src/SFML/System/String.cpp +++ b/extern/sfml/src/SFML/System/String.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Thread.cpp b/extern/sfml/src/SFML/System/Thread.cpp index 6576f10..6c17cec 100644 --- a/extern/sfml/src/SFML/System/Thread.cpp +++ b/extern/sfml/src/SFML/System/Thread.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/ThreadLocal.cpp b/extern/sfml/src/SFML/System/ThreadLocal.cpp index 5917cf3..ec1ac65 100644 --- a/extern/sfml/src/SFML/System/ThreadLocal.cpp +++ b/extern/sfml/src/SFML/System/ThreadLocal.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Time.cpp b/extern/sfml/src/SFML/System/Time.cpp index b7963e7..b9b627f 100644 --- a/extern/sfml/src/SFML/System/Time.cpp +++ b/extern/sfml/src/SFML/System/Time.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/ClockImpl.cpp b/extern/sfml/src/SFML/System/Unix/ClockImpl.cpp index 5a6e468..d3b367d 100644 --- a/extern/sfml/src/SFML/System/Unix/ClockImpl.cpp +++ b/extern/sfml/src/SFML/System/Unix/ClockImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/ClockImpl.hpp b/extern/sfml/src/SFML/System/Unix/ClockImpl.hpp index c966b3e..21b0118 100644 --- a/extern/sfml/src/SFML/System/Unix/ClockImpl.hpp +++ b/extern/sfml/src/SFML/System/Unix/ClockImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/MutexImpl.cpp b/extern/sfml/src/SFML/System/Unix/MutexImpl.cpp index 8c00059..448be0e 100644 --- a/extern/sfml/src/SFML/System/Unix/MutexImpl.cpp +++ b/extern/sfml/src/SFML/System/Unix/MutexImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/MutexImpl.hpp b/extern/sfml/src/SFML/System/Unix/MutexImpl.hpp index 83c4f42..259ee0d 100644 --- a/extern/sfml/src/SFML/System/Unix/MutexImpl.hpp +++ b/extern/sfml/src/SFML/System/Unix/MutexImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/SleepImpl.cpp b/extern/sfml/src/SFML/System/Unix/SleepImpl.cpp index 6aabaf4..1c395b5 100644 --- a/extern/sfml/src/SFML/System/Unix/SleepImpl.cpp +++ b/extern/sfml/src/SFML/System/Unix/SleepImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/SleepImpl.hpp b/extern/sfml/src/SFML/System/Unix/SleepImpl.hpp index 57843cc..c63953d 100644 --- a/extern/sfml/src/SFML/System/Unix/SleepImpl.hpp +++ b/extern/sfml/src/SFML/System/Unix/SleepImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/ThreadImpl.cpp b/extern/sfml/src/SFML/System/Unix/ThreadImpl.cpp index aaf906e..3b8234c 100644 --- a/extern/sfml/src/SFML/System/Unix/ThreadImpl.cpp +++ b/extern/sfml/src/SFML/System/Unix/ThreadImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/ThreadImpl.hpp b/extern/sfml/src/SFML/System/Unix/ThreadImpl.hpp index 4906326..4f89ee8 100644 --- a/extern/sfml/src/SFML/System/Unix/ThreadImpl.hpp +++ b/extern/sfml/src/SFML/System/Unix/ThreadImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.cpp b/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.cpp index 33c6889..35df093 100644 --- a/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.cpp +++ b/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.hpp b/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.hpp index a1d5e71..c8bcc48 100644 --- a/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.hpp +++ b/extern/sfml/src/SFML/System/Unix/ThreadLocalImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/ClockImpl.cpp b/extern/sfml/src/SFML/System/Win32/ClockImpl.cpp index 37ecc9c..d8d06b5 100644 --- a/extern/sfml/src/SFML/System/Win32/ClockImpl.cpp +++ b/extern/sfml/src/SFML/System/Win32/ClockImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/ClockImpl.hpp b/extern/sfml/src/SFML/System/Win32/ClockImpl.hpp index 0af6083..5a95da2 100644 --- a/extern/sfml/src/SFML/System/Win32/ClockImpl.hpp +++ b/extern/sfml/src/SFML/System/Win32/ClockImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/MutexImpl.cpp b/extern/sfml/src/SFML/System/Win32/MutexImpl.cpp index 3c3452e..f345cb1 100644 --- a/extern/sfml/src/SFML/System/Win32/MutexImpl.cpp +++ b/extern/sfml/src/SFML/System/Win32/MutexImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/MutexImpl.hpp b/extern/sfml/src/SFML/System/Win32/MutexImpl.hpp index 2947e3b..cf6cbd8 100644 --- a/extern/sfml/src/SFML/System/Win32/MutexImpl.hpp +++ b/extern/sfml/src/SFML/System/Win32/MutexImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/SleepImpl.cpp b/extern/sfml/src/SFML/System/Win32/SleepImpl.cpp index f61353e..e0697c2 100644 --- a/extern/sfml/src/SFML/System/Win32/SleepImpl.cpp +++ b/extern/sfml/src/SFML/System/Win32/SleepImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/SleepImpl.hpp b/extern/sfml/src/SFML/System/Win32/SleepImpl.hpp index 5c35641..f7073ee 100644 --- a/extern/sfml/src/SFML/System/Win32/SleepImpl.hpp +++ b/extern/sfml/src/SFML/System/Win32/SleepImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/ThreadImpl.cpp b/extern/sfml/src/SFML/System/Win32/ThreadImpl.cpp index 94bc7f8..0a80ec5 100644 --- a/extern/sfml/src/SFML/System/Win32/ThreadImpl.cpp +++ b/extern/sfml/src/SFML/System/Win32/ThreadImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/ThreadImpl.hpp b/extern/sfml/src/SFML/System/Win32/ThreadImpl.hpp index afdfc9f..cfabaab 100644 --- a/extern/sfml/src/SFML/System/Win32/ThreadImpl.hpp +++ b/extern/sfml/src/SFML/System/Win32/ThreadImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.cpp b/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.cpp index 49d95e0..4e47f6c 100644 --- a/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.cpp +++ b/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.hpp b/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.hpp index 3a2b023..a28e2d4 100644 --- a/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.hpp +++ b/extern/sfml/src/SFML/System/Win32/ThreadLocalImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/ClipboardImpl.cpp b/extern/sfml/src/SFML/Window/Android/ClipboardImpl.cpp index ef9af6c..5aceb0e 100644 --- a/extern/sfml/src/SFML/Window/Android/ClipboardImpl.cpp +++ b/extern/sfml/src/SFML/Window/Android/ClipboardImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/ClipboardImpl.hpp b/extern/sfml/src/SFML/Window/Android/ClipboardImpl.hpp index 22dda64..f657ccb 100644 --- a/extern/sfml/src/SFML/Window/Android/ClipboardImpl.hpp +++ b/extern/sfml/src/SFML/Window/Android/ClipboardImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/CursorImpl.cpp b/extern/sfml/src/SFML/Window/Android/CursorImpl.cpp index 3913b29..53d287e 100644 --- a/extern/sfml/src/SFML/Window/Android/CursorImpl.cpp +++ b/extern/sfml/src/SFML/Window/Android/CursorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/CursorImpl.hpp b/extern/sfml/src/SFML/Window/Android/CursorImpl.hpp index 57cffbd..86c1bcc 100644 --- a/extern/sfml/src/SFML/Window/Android/CursorImpl.hpp +++ b/extern/sfml/src/SFML/Window/Android/CursorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/SensorImpl.cpp b/extern/sfml/src/SFML/Window/Android/SensorImpl.cpp index ed89e4d..7142e1d 100644 --- a/extern/sfml/src/SFML/Window/Android/SensorImpl.cpp +++ b/extern/sfml/src/SFML/Window/Android/SensorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/SensorImpl.hpp b/extern/sfml/src/SFML/Window/Android/SensorImpl.hpp index bdfdfcc..f212db8 100644 --- a/extern/sfml/src/SFML/Window/Android/SensorImpl.hpp +++ b/extern/sfml/src/SFML/Window/Android/SensorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Android/WindowImplAndroid.cpp b/extern/sfml/src/SFML/Window/Android/WindowImplAndroid.cpp index 40992a0..2d724ec 100644 --- a/extern/sfml/src/SFML/Window/Android/WindowImplAndroid.cpp +++ b/extern/sfml/src/SFML/Window/Android/WindowImplAndroid.cpp @@ -664,7 +664,8 @@ Keyboard::Key WindowImplAndroid::androidKeyToSF(int32_t key) case AKEYCODE_BUTTON_THUMBR: case AKEYCODE_BUTTON_START: case AKEYCODE_BUTTON_SELECT: - case AKEYCODE_BUTTON_MODE: return Keyboard::Unknown; + case AKEYCODE_BUTTON_MODE: + default: return Keyboard::Unknown; } } diff --git a/extern/sfml/src/SFML/Window/CMakeLists.txt b/extern/sfml/src/SFML/Window/CMakeLists.txt index 982f4c4..55cb17f 100644 --- a/extern/sfml/src/SFML/Window/CMakeLists.txt +++ b/extern/sfml/src/SFML/Window/CMakeLists.txt @@ -81,7 +81,7 @@ if(SFML_OS_WINDOWS) # make sure that we use the Unicode version of the Win API functions add_definitions(-DUNICODE -D_UNICODE) -elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) +elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD) set(PLATFORM_SRC ${SRCROOT}/Unix/CursorImpl.hpp ${SRCROOT}/Unix/CursorImpl.cpp @@ -124,6 +124,13 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD) ${SRCROOT}/OpenBSD/JoystickImpl.cpp ${SRCROOT}/OpenBSD/JoystickImpl.hpp ) + elseif(SFML_OS_NETBSD) + set(PLATFORM_SRC + ${PLATFORM_SRC} + ${SRCROOT}/NetBSD/JoystickImpl.cpp + ${SRCROOT}/NetBSD/JoystickImpl.hpp + ) + endif() source_group("unix" FILES ${PLATFORM_SRC}) elseif(SFML_OS_MACOSX) @@ -243,7 +250,7 @@ endif() target_include_directories(sfml-window PRIVATE "${PROJECT_SOURCE_DIR}/extlibs/headers/vulkan") # find and setup usage for external libraries -if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OPENBSD) +if(SFML_OS_LINUX OR SFML_OS_FREEBSD OR SFML_OS_OPENBSD OR SFML_OS_NETBSD) sfml_find_package(X11 INCLUDE "X11_INCLUDE_DIR" LINK "X11_X11_LIB" "X11_Xrandr_LIB" "X11_Xcursor_LIB") target_link_libraries(sfml-window PRIVATE X11) endif() diff --git a/extern/sfml/src/SFML/Window/Clipboard.cpp b/extern/sfml/src/SFML/Window/Clipboard.cpp index 7828444..65275ec 100644 --- a/extern/sfml/src/SFML/Window/Clipboard.cpp +++ b/extern/sfml/src/SFML/Window/Clipboard.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/ClipboardImpl.hpp b/extern/sfml/src/SFML/Window/ClipboardImpl.hpp index d0d2c32..f664c31 100644 --- a/extern/sfml/src/SFML/Window/ClipboardImpl.hpp +++ b/extern/sfml/src/SFML/Window/ClipboardImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -32,7 +32,7 @@ #if defined(SFML_SYSTEM_WINDOWS) #include -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #include #elif defined(SFML_SYSTEM_MACOS) #include diff --git a/extern/sfml/src/SFML/Window/Context.cpp b/extern/sfml/src/SFML/Window/Context.cpp index 76cd0c5..1db2e33 100644 --- a/extern/sfml/src/SFML/Window/Context.cpp +++ b/extern/sfml/src/SFML/Window/Context.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Cursor.cpp b/extern/sfml/src/SFML/Window/Cursor.cpp index b7be0ac..0873420 100644 --- a/extern/sfml/src/SFML/Window/Cursor.cpp +++ b/extern/sfml/src/SFML/Window/Cursor.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/CursorImpl.hpp b/extern/sfml/src/SFML/Window/CursorImpl.hpp index bf507b2..62a3787 100644 --- a/extern/sfml/src/SFML/Window/CursorImpl.hpp +++ b/extern/sfml/src/SFML/Window/CursorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -34,7 +34,7 @@ #include -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #include diff --git a/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.cpp b/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.cpp index 472ae2a..28f44c3 100644 --- a/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.cpp +++ b/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // 2013-2013 David Demelier (demelier.david@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.hpp b/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.hpp index 3a24df7..f5791c7 100644 --- a/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.hpp +++ b/extern/sfml/src/SFML/Window/FreeBSD/JoystickImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/GlContext.cpp b/extern/sfml/src/SFML/Window/GlContext.cpp index 00d4a20..cb33c44 100644 --- a/extern/sfml/src/SFML/Window/GlContext.cpp +++ b/extern/sfml/src/SFML/Window/GlContext.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -57,7 +57,7 @@ #endif -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #if defined(SFML_OPENGL_ES) diff --git a/extern/sfml/src/SFML/Window/GlContext.hpp b/extern/sfml/src/SFML/Window/GlContext.hpp index 1f44762..816a68b 100644 --- a/extern/sfml/src/SFML/Window/GlContext.hpp +++ b/extern/sfml/src/SFML/Window/GlContext.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/GlResource.cpp b/extern/sfml/src/SFML/Window/GlResource.cpp index 538fa3b..aa39b36 100644 --- a/extern/sfml/src/SFML/Window/GlResource.cpp +++ b/extern/sfml/src/SFML/Window/GlResource.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/InputImpl.hpp b/extern/sfml/src/SFML/Window/InputImpl.hpp index 4294bdb..d5be0b0 100644 --- a/extern/sfml/src/SFML/Window/InputImpl.hpp +++ b/extern/sfml/src/SFML/Window/InputImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -32,7 +32,7 @@ #if defined(SFML_SYSTEM_WINDOWS) #include -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #include #elif defined(SFML_SYSTEM_MACOS) #include diff --git a/extern/sfml/src/SFML/Window/Joystick.cpp b/extern/sfml/src/SFML/Window/Joystick.cpp index 29fb4dd..f7cde83 100644 --- a/extern/sfml/src/SFML/Window/Joystick.cpp +++ b/extern/sfml/src/SFML/Window/Joystick.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/JoystickImpl.hpp b/extern/sfml/src/SFML/Window/JoystickImpl.hpp index e683552..7bc2a23 100644 --- a/extern/sfml/src/SFML/Window/JoystickImpl.hpp +++ b/extern/sfml/src/SFML/Window/JoystickImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -94,6 +94,10 @@ struct JoystickState #include +#elif defined(SFML_SYSTEM_NETBSD) + + #include + #elif defined(SFML_SYSTEM_MACOS) #include diff --git a/extern/sfml/src/SFML/Window/JoystickManager.cpp b/extern/sfml/src/SFML/Window/JoystickManager.cpp index 12eaa59..e6d1b04 100644 --- a/extern/sfml/src/SFML/Window/JoystickManager.cpp +++ b/extern/sfml/src/SFML/Window/JoystickManager.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/JoystickManager.hpp b/extern/sfml/src/SFML/Window/JoystickManager.hpp index 7289af7..9b6aab1 100644 --- a/extern/sfml/src/SFML/Window/JoystickManager.hpp +++ b/extern/sfml/src/SFML/Window/JoystickManager.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Keyboard.cpp b/extern/sfml/src/SFML/Window/Keyboard.cpp index 4cf4320..a6abdbe 100644 --- a/extern/sfml/src/SFML/Window/Keyboard.cpp +++ b/extern/sfml/src/SFML/Window/Keyboard.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Mouse.cpp b/extern/sfml/src/SFML/Window/Mouse.cpp index 2009413..cf1a016 100644 --- a/extern/sfml/src/SFML/Window/Mouse.cpp +++ b/extern/sfml/src/SFML/Window/Mouse.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.h b/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.h index 04097fe..cc09d09 100644 --- a/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.h +++ b/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm b/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm index 3ec0a09..b0c4643 100644 --- a/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm +++ b/extern/sfml/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.hpp b/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.hpp index 28adae1..fa6987f 100644 --- a/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.hpp +++ b/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.mm b/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.mm index 5a8438c..69eb940 100644 --- a/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.mm +++ b/extern/sfml/src/SFML/Window/OSX/ClipboardImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/OSX/CursorImpl.hpp b/extern/sfml/src/SFML/Window/OSX/CursorImpl.hpp index f0bd185..fe95091 100644 --- a/extern/sfml/src/SFML/Window/OSX/CursorImpl.hpp +++ b/extern/sfml/src/SFML/Window/OSX/CursorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/CursorImpl.mm b/extern/sfml/src/SFML/Window/OSX/CursorImpl.mm index a353913..cf87b02 100644 --- a/extern/sfml/src/SFML/Window/OSX/CursorImpl.mm +++ b/extern/sfml/src/SFML/Window/OSX/CursorImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. @@ -98,14 +98,22 @@ case Cursor::SizeVertical: m_cursor = [NSCursor resizeUpDownCursor]; break; case Cursor::Cross: m_cursor = [NSCursor crosshairCursor]; break; case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; break; + case Cursor::SizeLeft: m_cursor = [NSCursor resizeLeftRightCursor]; break; + case Cursor::SizeRight: m_cursor = [NSCursor resizeLeftRightCursor]; break; + case Cursor::SizeTop: m_cursor = [NSCursor resizeUpDownCursor]; break; + case Cursor::SizeBottom: m_cursor = [NSCursor resizeUpDownCursor]; break; // These cursor types are undocumented, may not be available on some platforms #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundeclared-selector" + case Cursor::SizeTopRight: + case Cursor::SizeBottomLeft: case Cursor::SizeBottomLeftTopRight: m_cursor = loadFromSelector(@selector(_windowResizeNorthEastSouthWestCursor)); break; + case Cursor::SizeTopLeft: + case Cursor::SizeBottomRight: case Cursor::SizeTopLeftBottomRight: m_cursor = loadFromSelector(@selector(_windowResizeNorthWestSouthEastCursor)); break; diff --git a/extern/sfml/src/SFML/Window/OSX/HIDInputManager.hpp b/extern/sfml/src/SFML/Window/OSX/HIDInputManager.hpp index e6f8c49..f935bf4 100644 --- a/extern/sfml/src/SFML/Window/OSX/HIDInputManager.hpp +++ b/extern/sfml/src/SFML/Window/OSX/HIDInputManager.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/HIDInputManager.mm b/extern/sfml/src/SFML/Window/OSX/HIDInputManager.mm index 3c44eab..8868d3e 100644 --- a/extern/sfml/src/SFML/Window/OSX/HIDInputManager.mm +++ b/extern/sfml/src/SFML/Window/OSX/HIDInputManager.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.cpp b/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.cpp index d1727bf..edcb5a4 100644 --- a/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.cpp +++ b/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.hpp b/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.hpp index f87c7a3..3a8305b 100644 --- a/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.hpp +++ b/extern/sfml/src/SFML/Window/OSX/HIDJoystickManager.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/InputImpl.hpp b/extern/sfml/src/SFML/Window/OSX/InputImpl.hpp index 202b2a7..391e83f 100644 --- a/extern/sfml/src/SFML/Window/OSX/InputImpl.hpp +++ b/extern/sfml/src/SFML/Window/OSX/InputImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/InputImpl.mm b/extern/sfml/src/SFML/Window/OSX/InputImpl.mm index b3c7d11..934470d 100644 --- a/extern/sfml/src/SFML/Window/OSX/InputImpl.mm +++ b/extern/sfml/src/SFML/Window/OSX/InputImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/JoystickImpl.cpp b/extern/sfml/src/SFML/Window/OSX/JoystickImpl.cpp index 4f4ee11..26b1727 100644 --- a/extern/sfml/src/SFML/Window/OSX/JoystickImpl.cpp +++ b/extern/sfml/src/SFML/Window/OSX/JoystickImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/JoystickImpl.hpp b/extern/sfml/src/SFML/Window/OSX/JoystickImpl.hpp index 9630409..3e0bb29 100644 --- a/extern/sfml/src/SFML/Window/OSX/JoystickImpl.hpp +++ b/extern/sfml/src/SFML/Window/OSX/JoystickImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/NSImage+raw.h b/extern/sfml/src/SFML/Window/OSX/NSImage+raw.h index f65363d..50187fe 100644 --- a/extern/sfml/src/SFML/Window/OSX/NSImage+raw.h +++ b/extern/sfml/src/SFML/Window/OSX/NSImage+raw.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/NSImage+raw.mm b/extern/sfml/src/SFML/Window/OSX/NSImage+raw.mm index ac0e777..4656bc8 100644 --- a/extern/sfml/src/SFML/Window/OSX/NSImage+raw.mm +++ b/extern/sfml/src/SFML/Window/OSX/NSImage+raw.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFApplication.h b/extern/sfml/src/SFML/Window/OSX/SFApplication.h index 3ee0e8f..d050cb9 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFApplication.h +++ b/extern/sfml/src/SFML/Window/OSX/SFApplication.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFApplication.m b/extern/sfml/src/SFML/Window/OSX/SFApplication.m index 311ec24..8a98a8a 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFApplication.m +++ b/extern/sfml/src/SFML/Window/OSX/SFApplication.m @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.h b/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.h index 9ebbedc..442bf23 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.h +++ b/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.m b/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.m index 381e412..86d74fd 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.m +++ b/extern/sfml/src/SFML/Window/OSX/SFApplicationDelegate.m @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFContext.hpp b/extern/sfml/src/SFML/Window/OSX/SFContext.hpp index 2fedc80..950a470 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFContext.hpp +++ b/extern/sfml/src/SFML/Window/OSX/SFContext.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFContext.mm b/extern/sfml/src/SFML/Window/OSX/SFContext.mm index 02ffe36..776e3c5 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFContext.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFContext.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h b/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h index b2cf0b1..c12d42c 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h +++ b/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm b/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm index fd6dfe3..5c73dae 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFKeyboardModifiersHelper.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm index e9a6fac..193d12c 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h index 31e6a65..68862c0 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h +++ b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+keyboard_priv.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse.mm b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse.mm index b812dd2..e505dfd 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h index 05eba4d..f788842 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h +++ b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView+mouse_priv.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.h b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.h index 641eab2..978586a 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.h +++ b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.mm b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.mm index b6eb0d2..612a1cc 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFOpenGLView.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.h b/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.h index da94d12..288fdc2 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.h +++ b/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.m b/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.m index 8aa63ab..155d271 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.m +++ b/extern/sfml/src/SFML/Window/OSX/SFSilentResponder.m @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFViewController.h b/extern/sfml/src/SFML/Window/OSX/SFViewController.h index cc5108a..f926e56 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFViewController.h +++ b/extern/sfml/src/SFML/Window/OSX/SFViewController.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFViewController.mm b/extern/sfml/src/SFML/Window/OSX/SFViewController.mm index 8d5cb34..e72543c 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFViewController.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFViewController.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFWindow.h b/extern/sfml/src/SFML/Window/OSX/SFWindow.h index 58875a6..a59101a 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFWindow.h +++ b/extern/sfml/src/SFML/Window/OSX/SFWindow.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFWindow.m b/extern/sfml/src/SFML/Window/OSX/SFWindow.m index ae348dc..ff60c6c 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFWindow.m +++ b/extern/sfml/src/SFML/Window/OSX/SFWindow.m @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFWindowController.h b/extern/sfml/src/SFML/Window/OSX/SFWindowController.h index cba2b30..5dac501 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFWindowController.h +++ b/extern/sfml/src/SFML/Window/OSX/SFWindowController.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SFWindowController.mm b/extern/sfml/src/SFML/Window/OSX/SFWindowController.mm index bc368c7..fe1fc06 100644 --- a/extern/sfml/src/SFML/Window/OSX/SFWindowController.mm +++ b/extern/sfml/src/SFML/Window/OSX/SFWindowController.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. @@ -123,6 +123,8 @@ -(id)initWithWindow:(NSWindow*)window // Set the view to the window as its content view. [m_window setContentView:m_oglView]; + + [m_oglView finishInit]; } return self; diff --git a/extern/sfml/src/SFML/Window/OSX/Scaling.h b/extern/sfml/src/SFML/Window/OSX/Scaling.h index f44c77e..975a3f0 100644 --- a/extern/sfml/src/SFML/Window/OSX/Scaling.h +++ b/extern/sfml/src/SFML/Window/OSX/Scaling.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/SensorImpl.cpp b/extern/sfml/src/SFML/Window/OSX/SensorImpl.cpp index e91d5cd..dfa1a65 100644 --- a/extern/sfml/src/SFML/Window/OSX/SensorImpl.cpp +++ b/extern/sfml/src/SFML/Window/OSX/SensorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/OSX/SensorImpl.hpp b/extern/sfml/src/SFML/Window/OSX/SensorImpl.hpp index c755527..71c7e68 100644 --- a/extern/sfml/src/SFML/Window/OSX/SensorImpl.hpp +++ b/extern/sfml/src/SFML/Window/OSX/SensorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/OSX/VideoModeImpl.cpp b/extern/sfml/src/SFML/Window/OSX/VideoModeImpl.cpp index 741c4bd..7df01a5 100644 --- a/extern/sfml/src/SFML/Window/OSX/VideoModeImpl.cpp +++ b/extern/sfml/src/SFML/Window/OSX/VideoModeImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.hpp b/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.hpp index efa0f66..005eb76 100644 --- a/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.hpp +++ b/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.mm b/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.mm index e68f42e..091b7b2 100644 --- a/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.mm +++ b/extern/sfml/src/SFML/Window/OSX/WindowImplCocoa.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/WindowImplDelegateProtocol.h b/extern/sfml/src/SFML/Window/OSX/WindowImplDelegateProtocol.h index 925c9e5..dd767f5 100644 --- a/extern/sfml/src/SFML/Window/OSX/WindowImplDelegateProtocol.h +++ b/extern/sfml/src/SFML/Window/OSX/WindowImplDelegateProtocol.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.hpp b/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.hpp index 41c3835..bac8b33 100644 --- a/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.hpp +++ b/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.mm b/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.mm index 06d0fe5..9f2aee0 100644 --- a/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.mm +++ b/extern/sfml/src/SFML/Window/OSX/cg_sf_conversion.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.h b/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.h index 9ecd9df..3fd2357 100644 --- a/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.h +++ b/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.mm b/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.mm index d942270..39de033 100644 --- a/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.mm +++ b/extern/sfml/src/SFML/Window/OSX/cpp_objc_conversion.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/src/SFML/Window/Sensor.cpp b/extern/sfml/src/SFML/Window/Sensor.cpp index 316b8d5..d313eca 100644 --- a/extern/sfml/src/SFML/Window/Sensor.cpp +++ b/extern/sfml/src/SFML/Window/Sensor.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/SensorImpl.hpp b/extern/sfml/src/SFML/Window/SensorImpl.hpp index cd50911..ce2c334 100644 --- a/extern/sfml/src/SFML/Window/SensorImpl.hpp +++ b/extern/sfml/src/SFML/Window/SensorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -35,7 +35,7 @@ #include -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #include diff --git a/extern/sfml/src/SFML/Window/SensorManager.cpp b/extern/sfml/src/SFML/Window/SensorManager.cpp index 73304be..a606995 100644 --- a/extern/sfml/src/SFML/Window/SensorManager.cpp +++ b/extern/sfml/src/SFML/Window/SensorManager.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/SensorManager.hpp b/extern/sfml/src/SFML/Window/SensorManager.hpp index 41b3172..eacd752 100644 --- a/extern/sfml/src/SFML/Window/SensorManager.hpp +++ b/extern/sfml/src/SFML/Window/SensorManager.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Touch.cpp b/extern/sfml/src/SFML/Window/Touch.cpp index 67c60da..b5b191d 100644 --- a/extern/sfml/src/SFML/Window/Touch.cpp +++ b/extern/sfml/src/SFML/Window/Touch.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.cpp b/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.cpp index 32ea47e..e99f3d7 100644 --- a/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.cpp +++ b/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.hpp b/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.hpp index a61593b..a92460c 100644 --- a/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.hpp +++ b/extern/sfml/src/SFML/Window/Unix/ClipboardImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/CursorImpl.cpp b/extern/sfml/src/SFML/Window/Unix/CursorImpl.cpp index 4aabffa..4ceac56 100644 --- a/extern/sfml/src/SFML/Window/Unix/CursorImpl.cpp +++ b/extern/sfml/src/SFML/Window/Unix/CursorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -165,16 +165,24 @@ bool CursorImpl::loadFromSystem(Cursor::Type type) { default: return false; - case Cursor::Arrow: shape = XC_arrow; break; - case Cursor::Wait: shape = XC_watch; break; - case Cursor::Text: shape = XC_xterm; break; - case Cursor::Hand: shape = XC_hand1; break; - case Cursor::SizeHorizontal: shape = XC_sb_h_double_arrow; break; - case Cursor::SizeVertical: shape = XC_sb_v_double_arrow; break; - case Cursor::SizeAll: shape = XC_fleur; break; - case Cursor::Cross: shape = XC_crosshair; break; - case Cursor::Help: shape = XC_question_arrow; break; - case Cursor::NotAllowed: shape = XC_X_cursor; break; + case Cursor::Arrow: shape = XC_arrow; break; + case Cursor::Wait: shape = XC_watch; break; + case Cursor::Text: shape = XC_xterm; break; + case Cursor::Hand: shape = XC_hand1; break; + case Cursor::SizeHorizontal: shape = XC_sb_h_double_arrow; break; + case Cursor::SizeVertical: shape = XC_sb_v_double_arrow; break; + case Cursor::SizeLeft: shape = XC_left_side; break; + case Cursor::SizeRight: shape = XC_right_side; break; + case Cursor::SizeTop: shape = XC_top_side; break; + case Cursor::SizeBottom: shape = XC_bottom_side; break; + case Cursor::SizeTopLeft: shape = XC_top_left_corner; break; + case Cursor::SizeBottomRight: shape = XC_bottom_right_corner; break; + case Cursor::SizeBottomLeft: shape = XC_bottom_left_corner; break; + case Cursor::SizeTopRight: shape = XC_top_right_corner; break; + case Cursor::SizeAll: shape = XC_fleur; break; + case Cursor::Cross: shape = XC_crosshair; break; + case Cursor::Help: shape = XC_question_arrow; break; + case Cursor::NotAllowed: shape = XC_X_cursor; break; } m_cursor = XCreateFontCursor(m_display, shape); diff --git a/extern/sfml/src/SFML/Window/Unix/CursorImpl.hpp b/extern/sfml/src/SFML/Window/Unix/CursorImpl.hpp index cfd3c30..3d6e15a 100644 --- a/extern/sfml/src/SFML/Window/Unix/CursorImpl.hpp +++ b/extern/sfml/src/SFML/Window/Unix/CursorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/Display.cpp b/extern/sfml/src/SFML/Window/Unix/Display.cpp index 3ebbf36..144fe78 100644 --- a/extern/sfml/src/SFML/Window/Unix/Display.cpp +++ b/extern/sfml/src/SFML/Window/Unix/Display.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/Display.hpp b/extern/sfml/src/SFML/Window/Unix/Display.hpp index 3a7c403..81a437f 100644 --- a/extern/sfml/src/SFML/Window/Unix/Display.hpp +++ b/extern/sfml/src/SFML/Window/Unix/Display.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/GlxContext.cpp b/extern/sfml/src/SFML/Window/Unix/GlxContext.cpp index d6525eb..24455c8 100644 --- a/extern/sfml/src/SFML/Window/Unix/GlxContext.cpp +++ b/extern/sfml/src/SFML/Window/Unix/GlxContext.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/GlxContext.hpp b/extern/sfml/src/SFML/Window/Unix/GlxContext.hpp index f5e4b87..9df9024 100644 --- a/extern/sfml/src/SFML/Window/Unix/GlxContext.hpp +++ b/extern/sfml/src/SFML/Window/Unix/GlxContext.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/InputImpl.cpp b/extern/sfml/src/SFML/Window/Unix/InputImpl.cpp index 3f3b6d7..f404d6e 100644 --- a/extern/sfml/src/SFML/Window/Unix/InputImpl.cpp +++ b/extern/sfml/src/SFML/Window/Unix/InputImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/InputImpl.hpp b/extern/sfml/src/SFML/Window/Unix/InputImpl.hpp index 99d1c71..61d24af 100644 --- a/extern/sfml/src/SFML/Window/Unix/InputImpl.hpp +++ b/extern/sfml/src/SFML/Window/Unix/InputImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/JoystickImpl.cpp b/extern/sfml/src/SFML/Window/Unix/JoystickImpl.cpp index 483a054..8223a10 100644 --- a/extern/sfml/src/SFML/Window/Unix/JoystickImpl.cpp +++ b/extern/sfml/src/SFML/Window/Unix/JoystickImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/JoystickImpl.hpp b/extern/sfml/src/SFML/Window/Unix/JoystickImpl.hpp index 7f90527..9a4a46f 100644 --- a/extern/sfml/src/SFML/Window/Unix/JoystickImpl.hpp +++ b/extern/sfml/src/SFML/Window/Unix/JoystickImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/SensorImpl.cpp b/extern/sfml/src/SFML/Window/Unix/SensorImpl.cpp index e91d5cd..dfa1a65 100644 --- a/extern/sfml/src/SFML/Window/Unix/SensorImpl.cpp +++ b/extern/sfml/src/SFML/Window/Unix/SensorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/SensorImpl.hpp b/extern/sfml/src/SFML/Window/Unix/SensorImpl.hpp index 4ef8457..92ec7d8 100644 --- a/extern/sfml/src/SFML/Window/Unix/SensorImpl.hpp +++ b/extern/sfml/src/SFML/Window/Unix/SensorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/VideoModeImpl.cpp b/extern/sfml/src/SFML/Window/Unix/VideoModeImpl.cpp index 6cc0465..f1b86a9 100644 --- a/extern/sfml/src/SFML/Window/Unix/VideoModeImpl.cpp +++ b/extern/sfml/src/SFML/Window/Unix/VideoModeImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.cpp b/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.cpp index 1ec6e34..b4c06bc 100644 --- a/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.cpp +++ b/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.hpp b/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.hpp index ded47e9..6d6e82e 100644 --- a/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.hpp +++ b/extern/sfml/src/SFML/Window/Unix/VulkanImplX11.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Unix/WindowImplX11.cpp b/extern/sfml/src/SFML/Window/Unix/WindowImplX11.cpp index 726eef4..36b2f1b 100644 --- a/extern/sfml/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/extern/sfml/src/SFML/Window/Unix/WindowImplX11.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -1145,7 +1145,9 @@ void WindowImplX11::setMouseCursorGrabbed(bool grabbed) } else { + // Release the cursor from the window and disable cursor grabbing XUngrabPointer(m_display, CurrentTime); + m_cursorGrabbed = false; } } diff --git a/extern/sfml/src/SFML/Window/Unix/WindowImplX11.hpp b/extern/sfml/src/SFML/Window/Unix/WindowImplX11.hpp index 0237dd3..255e006 100644 --- a/extern/sfml/src/SFML/Window/Unix/WindowImplX11.hpp +++ b/extern/sfml/src/SFML/Window/Unix/WindowImplX11.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/VideoMode.cpp b/extern/sfml/src/SFML/Window/VideoMode.cpp index a8ca72c..7706efd 100644 --- a/extern/sfml/src/SFML/Window/VideoMode.cpp +++ b/extern/sfml/src/SFML/Window/VideoMode.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/VideoModeImpl.hpp b/extern/sfml/src/SFML/Window/VideoModeImpl.hpp index 3be196d..b73ccbd 100644 --- a/extern/sfml/src/SFML/Window/VideoModeImpl.hpp +++ b/extern/sfml/src/SFML/Window/VideoModeImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Vulkan.cpp b/extern/sfml/src/SFML/Window/Vulkan.cpp index 1a13bee..39958f8 100644 --- a/extern/sfml/src/SFML/Window/Vulkan.cpp +++ b/extern/sfml/src/SFML/Window/Vulkan.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -32,7 +32,7 @@ #include typedef sf::priv::VulkanImplWin32 VulkanImplType; -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #include typedef sf::priv::VulkanImplX11 VulkanImplType; diff --git a/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.cpp b/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.cpp index 8b88e1f..21120fa 100644 --- a/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.cpp +++ b/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.hpp b/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.hpp index 43b1202..a7f6399 100644 --- a/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.hpp +++ b/extern/sfml/src/SFML/Window/Win32/ClipboardImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/CursorImpl.cpp b/extern/sfml/src/SFML/Window/Win32/CursorImpl.cpp index cfe36f5..3e173a7 100644 --- a/extern/sfml/src/SFML/Window/Win32/CursorImpl.cpp +++ b/extern/sfml/src/SFML/Window/Win32/CursorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -152,6 +152,14 @@ bool CursorImpl::loadFromSystem(Cursor::Type type) case Cursor::SizeVertical: shape = IDC_SIZENS; break; case Cursor::SizeTopLeftBottomRight: shape = IDC_SIZENWSE; break; case Cursor::SizeBottomLeftTopRight: shape = IDC_SIZENESW; break; + case Cursor::SizeLeft: shape = IDC_SIZEWE; break; + case Cursor::SizeRight: shape = IDC_SIZEWE; break; + case Cursor::SizeTop: shape = IDC_SIZENS; break; + case Cursor::SizeBottom: shape = IDC_SIZENS; break; + case Cursor::SizeTopLeft: shape = IDC_SIZENWSE; break; + case Cursor::SizeBottomRight: shape = IDC_SIZENWSE; break; + case Cursor::SizeBottomLeft: shape = IDC_SIZENESW; break; + case Cursor::SizeTopRight: shape = IDC_SIZENESW; break; case Cursor::SizeAll: shape = IDC_SIZEALL; break; case Cursor::Cross: shape = IDC_CROSS; break; case Cursor::Help: shape = IDC_HELP; break; diff --git a/extern/sfml/src/SFML/Window/Win32/CursorImpl.hpp b/extern/sfml/src/SFML/Window/Win32/CursorImpl.hpp index 945a268..c7fa88d 100644 --- a/extern/sfml/src/SFML/Window/Win32/CursorImpl.hpp +++ b/extern/sfml/src/SFML/Window/Win32/CursorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/InputImpl.cpp b/extern/sfml/src/SFML/Window/Win32/InputImpl.cpp index 4ad0368..6314fe6 100644 --- a/extern/sfml/src/SFML/Window/Win32/InputImpl.cpp +++ b/extern/sfml/src/SFML/Window/Win32/InputImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/InputImpl.hpp b/extern/sfml/src/SFML/Window/Win32/InputImpl.hpp index 483062a..98c7bd8 100644 --- a/extern/sfml/src/SFML/Window/Win32/InputImpl.hpp +++ b/extern/sfml/src/SFML/Window/Win32/InputImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/JoystickImpl.cpp b/extern/sfml/src/SFML/Window/Win32/JoystickImpl.cpp index 49f85da..3719926 100644 --- a/extern/sfml/src/SFML/Window/Win32/JoystickImpl.cpp +++ b/extern/sfml/src/SFML/Window/Win32/JoystickImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -907,7 +907,7 @@ JoystickState JoystickImpl::updateDInputBuffered() { if (m_axes[j] == events[i].dwOfs) { - if (j == Joystick::PovX) + if ((j == Joystick::PovX) || (j == Joystick::PovY)) { unsigned short value = LOWORD(events[i].dwData); @@ -915,26 +915,13 @@ JoystickState JoystickImpl::updateDInputBuffered() { float angle = (static_cast(value)) * 3.141592654f / DI_DEGREES / 180.f; - m_state.axes[j] = std::sin(angle) * 100.f; + m_state.axes[Joystick::PovX] = std::sin(angle) * 100.f; + m_state.axes[Joystick::PovY] = std::cos(angle) * 100.f; } else { - m_state.axes[j] = 0; - } - } - else if (j == Joystick::PovY) - { - unsigned short value = LOWORD(events[i].dwData); - - if (value != 0xFFFF) - { - float angle = (static_cast(value)) * 3.141592654f / DI_DEGREES / 180.f; - - m_state.axes[j] = std::cos(angle) * 100.f; - } - else - { - m_state.axes[j] = 0.f; + m_state.axes[Joystick::PovX] = 0.f; + m_state.axes[Joystick::PovY] = 0.f; } } else @@ -1009,22 +996,7 @@ JoystickState JoystickImpl::updateDInputPolled() { if (m_axes[i] != -1) { - if (i == Joystick::PovX) - { - unsigned short value = LOWORD(*reinterpret_cast(reinterpret_cast(&joystate) + m_axes[i])); - - if (value != 0xFFFF) - { - float angle = (static_cast(value)) * 3.141592654f / DI_DEGREES / 180.f; - - state.axes[i] = std::sin(angle) * 100.f; - } - else - { - state.axes[i] = 0; - } - } - else if (i == Joystick::PovY) + if ((i == Joystick::PovX) || (i == Joystick::PovY)) { unsigned short value = LOWORD(*reinterpret_cast(reinterpret_cast(&joystate) + m_axes[i])); @@ -1032,11 +1004,13 @@ JoystickState JoystickImpl::updateDInputPolled() { float angle = (static_cast(value)) * 3.141592654f / DI_DEGREES / 180.f; - state.axes[i] = std::cos(angle) * 100.f; + state.axes[Joystick::PovX] = std::sin(angle) * 100.f; + state.axes[Joystick::PovY] = std::cos(angle) * 100.f; } else { - state.axes[i] = 0.f; + state.axes[Joystick::PovX] = 0.f; + state.axes[Joystick::PovY] = 0.f; } } else diff --git a/extern/sfml/src/SFML/Window/Win32/JoystickImpl.hpp b/extern/sfml/src/SFML/Window/Win32/JoystickImpl.hpp index 0ed1d81..d2111dc 100644 --- a/extern/sfml/src/SFML/Window/Win32/JoystickImpl.hpp +++ b/extern/sfml/src/SFML/Window/Win32/JoystickImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/SensorImpl.cpp b/extern/sfml/src/SFML/Window/Win32/SensorImpl.cpp index e91d5cd..dfa1a65 100644 --- a/extern/sfml/src/SFML/Window/Win32/SensorImpl.cpp +++ b/extern/sfml/src/SFML/Window/Win32/SensorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/SensorImpl.hpp b/extern/sfml/src/SFML/Window/Win32/SensorImpl.hpp index 9126574..826b32e 100644 --- a/extern/sfml/src/SFML/Window/Win32/SensorImpl.hpp +++ b/extern/sfml/src/SFML/Window/Win32/SensorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/VideoModeImpl.cpp b/extern/sfml/src/SFML/Window/Win32/VideoModeImpl.cpp index 3e305d0..22385b1 100644 --- a/extern/sfml/src/SFML/Window/Win32/VideoModeImpl.cpp +++ b/extern/sfml/src/SFML/Window/Win32/VideoModeImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.cpp b/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.cpp index a843b0b..b463820 100644 --- a/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.cpp +++ b/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.hpp b/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.hpp index f3de5e6..0baa535 100644 --- a/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.hpp +++ b/extern/sfml/src/SFML/Window/Win32/VulkanImplWin32.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/WglContext.cpp b/extern/sfml/src/SFML/Window/Win32/WglContext.cpp index 62ca37f..916912c 100644 --- a/extern/sfml/src/SFML/Window/Win32/WglContext.cpp +++ b/extern/sfml/src/SFML/Window/Win32/WglContext.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/WglContext.hpp b/extern/sfml/src/SFML/Window/Win32/WglContext.hpp index 184e06d..d31d7f1 100644 --- a/extern/sfml/src/SFML/Window/Win32/WglContext.hpp +++ b/extern/sfml/src/SFML/Window/Win32/WglContext.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.cpp b/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.cpp index ed56f02..a424843 100644 --- a/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.cpp +++ b/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -430,8 +430,9 @@ void WindowImplWin32::setKeyRepeatEnabled(bool enabled) void WindowImplWin32::requestFocus() { // Allow focus stealing only within the same process; compare PIDs of current and foreground window - DWORD thisPid = GetWindowThreadProcessId(m_handle, NULL); - DWORD foregroundPid = GetWindowThreadProcessId(GetForegroundWindow(), NULL); + DWORD thisPid, foregroundPid; + GetWindowThreadProcessId(m_handle, &thisPid); + GetWindowThreadProcessId(GetForegroundWindow(), &foregroundPid); if (thisPid == foregroundPid) { diff --git a/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.hpp b/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.hpp index c58d77d..7f2057a 100644 --- a/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.hpp +++ b/extern/sfml/src/SFML/Window/Win32/WindowImplWin32.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/Window.cpp b/extern/sfml/src/SFML/Window/Window.cpp index 415b136..27013d9 100644 --- a/extern/sfml/src/SFML/Window/Window.cpp +++ b/extern/sfml/src/SFML/Window/Window.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/WindowBase.cpp b/extern/sfml/src/SFML/Window/WindowBase.cpp index 5c18eef..e2989a9 100644 --- a/extern/sfml/src/SFML/Window/WindowBase.cpp +++ b/extern/sfml/src/SFML/Window/WindowBase.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/WindowImpl.cpp b/extern/sfml/src/SFML/Window/WindowImpl.cpp index afbfddf..93ddbed 100644 --- a/extern/sfml/src/SFML/Window/WindowImpl.cpp +++ b/extern/sfml/src/SFML/Window/WindowImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. @@ -41,7 +41,7 @@ #include typedef sf::priv::VulkanImplWin32 VulkanImplType; -#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) +#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD) || defined(SFML_SYSTEM_OPENBSD) || defined(SFML_SYSTEM_NETBSD) #include typedef sf::priv::WindowImplX11 WindowImplType; @@ -181,7 +181,6 @@ void WindowImpl::processJoystickEvents() // Copy the previous state of the joystick and get the new one JoystickState previousState = m_joystickStates[i]; m_joystickStates[i] = JoystickManager::getInstance().getState(i); - JoystickCaps caps = JoystickManager::getInstance().getCapabilities(i); // Connection state bool connected = m_joystickStates[i].connected; @@ -199,6 +198,8 @@ void WindowImpl::processJoystickEvents() if (connected) { + JoystickCaps caps = JoystickManager::getInstance().getCapabilities(i); + // Axes for (unsigned int j = 0; j < Joystick::AxisCount; ++j) { diff --git a/extern/sfml/src/SFML/Window/WindowImpl.hpp b/extern/sfml/src/SFML/Window/WindowImpl.hpp index f8d079c..9557fe5 100644 --- a/extern/sfml/src/SFML/Window/WindowImpl.hpp +++ b/extern/sfml/src/SFML/Window/WindowImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.hpp b/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.hpp index ff555ac..65fd26e 100644 --- a/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.hpp +++ b/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.mm b/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.mm index 48d95df..f857bf0 100644 --- a/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.mm +++ b/extern/sfml/src/SFML/Window/iOS/ClipboardImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/CursorImpl.cpp b/extern/sfml/src/SFML/Window/iOS/CursorImpl.cpp index 8a511a6..35249dd 100644 --- a/extern/sfml/src/SFML/Window/iOS/CursorImpl.cpp +++ b/extern/sfml/src/SFML/Window/iOS/CursorImpl.cpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/CursorImpl.hpp b/extern/sfml/src/SFML/Window/iOS/CursorImpl.hpp index c7cb02d..d03146d 100644 --- a/extern/sfml/src/SFML/Window/iOS/CursorImpl.hpp +++ b/extern/sfml/src/SFML/Window/iOS/CursorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/EaglContext.hpp b/extern/sfml/src/SFML/Window/iOS/EaglContext.hpp index 9c01c90..79931ef 100644 --- a/extern/sfml/src/SFML/Window/iOS/EaglContext.hpp +++ b/extern/sfml/src/SFML/Window/iOS/EaglContext.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/EaglContext.mm b/extern/sfml/src/SFML/Window/iOS/EaglContext.mm index 7151424..f8d55d9 100644 --- a/extern/sfml/src/SFML/Window/iOS/EaglContext.mm +++ b/extern/sfml/src/SFML/Window/iOS/EaglContext.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/InputImpl.hpp b/extern/sfml/src/SFML/Window/iOS/InputImpl.hpp index c17c40b..fea3797 100644 --- a/extern/sfml/src/SFML/Window/iOS/InputImpl.hpp +++ b/extern/sfml/src/SFML/Window/iOS/InputImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/InputImpl.mm b/extern/sfml/src/SFML/Window/iOS/InputImpl.mm index c254eb3..795435a 100644 --- a/extern/sfml/src/SFML/Window/iOS/InputImpl.mm +++ b/extern/sfml/src/SFML/Window/iOS/InputImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/JoystickImpl.hpp b/extern/sfml/src/SFML/Window/iOS/JoystickImpl.hpp index 7804716..dd77ecf 100644 --- a/extern/sfml/src/SFML/Window/iOS/JoystickImpl.hpp +++ b/extern/sfml/src/SFML/Window/iOS/JoystickImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/JoystickImpl.mm b/extern/sfml/src/SFML/Window/iOS/JoystickImpl.mm index 6f4ab14..7be01bb 100644 --- a/extern/sfml/src/SFML/Window/iOS/JoystickImpl.mm +++ b/extern/sfml/src/SFML/Window/iOS/JoystickImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/ObjCType.hpp b/extern/sfml/src/SFML/Window/iOS/ObjCType.hpp index 5d90ed7..b6d87ed 100644 --- a/extern/sfml/src/SFML/Window/iOS/ObjCType.hpp +++ b/extern/sfml/src/SFML/Window/iOS/ObjCType.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.hpp b/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.hpp index d651d0c..0c3eb1b 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.hpp +++ b/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.mm b/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.mm index 4618199..309f42a 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.mm +++ b/extern/sfml/src/SFML/Window/iOS/SFAppDelegate.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFMain.hpp b/extern/sfml/src/SFML/Window/iOS/SFMain.hpp index 815c3cc..344203e 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFMain.hpp +++ b/extern/sfml/src/SFML/Window/iOS/SFMain.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFMain.mm b/extern/sfml/src/SFML/Window/iOS/SFMain.mm index f51cdac..a7c82a8 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFMain.mm +++ b/extern/sfml/src/SFML/Window/iOS/SFMain.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFView.hpp b/extern/sfml/src/SFML/Window/iOS/SFView.hpp index ef11530..6398e83 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFView.hpp +++ b/extern/sfml/src/SFML/Window/iOS/SFView.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFView.mm b/extern/sfml/src/SFML/Window/iOS/SFView.mm index 1cb0606..9b38bbf 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFView.mm +++ b/extern/sfml/src/SFML/Window/iOS/SFView.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFViewController.hpp b/extern/sfml/src/SFML/Window/iOS/SFViewController.hpp index 3db3ea2..1148177 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFViewController.hpp +++ b/extern/sfml/src/SFML/Window/iOS/SFViewController.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SFViewController.mm b/extern/sfml/src/SFML/Window/iOS/SFViewController.mm index 2a00cd4..34c111a 100644 --- a/extern/sfml/src/SFML/Window/iOS/SFViewController.mm +++ b/extern/sfml/src/SFML/Window/iOS/SFViewController.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SensorImpl.hpp b/extern/sfml/src/SFML/Window/iOS/SensorImpl.hpp index 8bd1bd6..142cce1 100644 --- a/extern/sfml/src/SFML/Window/iOS/SensorImpl.hpp +++ b/extern/sfml/src/SFML/Window/iOS/SensorImpl.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/SensorImpl.mm b/extern/sfml/src/SFML/Window/iOS/SensorImpl.mm index 60d65b3..33c7159 100644 --- a/extern/sfml/src/SFML/Window/iOS/SensorImpl.mm +++ b/extern/sfml/src/SFML/Window/iOS/SensorImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/VideoModeImpl.mm b/extern/sfml/src/SFML/Window/iOS/VideoModeImpl.mm index 2887a42..89e9f90 100644 --- a/extern/sfml/src/SFML/Window/iOS/VideoModeImpl.mm +++ b/extern/sfml/src/SFML/Window/iOS/VideoModeImpl.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.hpp b/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.hpp index c590c7c..52aeda6 100644 --- a/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.hpp +++ b/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.mm b/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.mm index d53ac89..e5fe87d 100644 --- a/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.mm +++ b/extern/sfml/src/SFML/Window/iOS/WindowImplUIKit.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Laurent Gomila (laurent@sfml-dev.org) +// Copyright (C) 2007-2021 Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. diff --git a/extern/sfml/test.cpp b/extern/sfml/test.cpp deleted file mode 100644 index 630b23b..0000000 --- a/extern/sfml/test.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include "SFML/test.h" - -void test() { - -} -int main() { - -} \ No newline at end of file diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp index e3c15e6..4ea6d7f 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp +++ b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.hpp @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm index f4be350..416b86c 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm +++ b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/ResourcePath.mm @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// // // SFML - Simple and Fast Multimedia Library -// Copyright (C) 2007-2020 Marco Antognini (antognini.marco@gmail.com), +// Copyright (C) 2007-2021 Marco Antognini (antognini.marco@gmail.com), // Laurent Gomila (laurent@sfml-dev.org) // // This software is provided 'as-is', without any express or implied warranty. diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in index 5185843..5014ee4 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in +++ b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@ - cute_image.jpg + background.jpg Path - cute_image.jpg + background.jpg Group Resources - nice_music.ogg + doodle_pop.ogg Path - nice_music.ogg + doodle_pop.ogg Group Resources - sansation.ttf + tuffy.ttf Path - sansation.ttf + tuffy.ttf Group Resources diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/cute_image.jpg b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/cute_image.jpg deleted file mode 100644 index 20724fa92f2ce1acfb82787a0ec9debdca103f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142959 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 NV8xiE)h|##|Jjbt96JC2 diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp index 58ac666..129ff88 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp +++ b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/main.cpp @@ -34,14 +34,14 @@ int main(int, char const**) // Load a sprite to display sf::Texture texture; - if (!texture.loadFromFile(resourcePath() + "cute_image.jpg")) { + if (!texture.loadFromFile(resourcePath() + "background.jpg")) { return EXIT_FAILURE; } sf::Sprite sprite(texture); // Create a graphical text to display sf::Font font; - if (!font.loadFromFile(resourcePath() + "sansation.ttf")) { + if (!font.loadFromFile(resourcePath() + "tuffy.ttf")) { return EXIT_FAILURE; } sf::Text text("Hello SFML", font, 50); @@ -49,7 +49,7 @@ int main(int, char const**) // Load a music to play sf::Music music; - if (!music.openFromFile(resourcePath() + "nice_music.ogg")) { + if (!music.openFromFile(resourcePath() + "doodle_pop.ogg")) { return EXIT_FAILURE; } diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/nice_music.ogg b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/nice_music.ogg deleted file mode 100644 index f764d61db05f2f2516f491e615f0afb2d51ef2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153776 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 Tx%Yr^KOg32zryX%d+6l?8x!SD diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/sansation.ttf b/extern/sfml/tools/xcode/templates/SFML/SFML App.xctemplate/sansation.ttf deleted file mode 100644 index d85fbc81d91e22c647a3338a37f24a9d684dcf8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28912 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 Y(-osHj2F<;P%p3rF{>lYhrW~jFV!_TuK)l5 diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist b/extern/sfml/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist index 96e09a6..3474797 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist +++ b/extern/sfml/tools/xcode/templates/SFML/SFML Base.xctemplate/TemplateInfo.plist @@ -3,7 +3,7 @@ - cute_image.jpg + background.jpg Path - cute_image.jpg + background.jpg Group Resources - nice_music.ogg + doodle_pop.ogg Path - nice_music.ogg + doodle_pop.ogg Group Resources - sansation.ttf + tuffy.ttf Path - sansation.ttf + tuffy.ttf Group Resources diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/cute_image.jpg b/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/cute_image.jpg deleted file mode 100644 index 20724fa92f2ce1acfb82787a0ec9debdca103f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142959 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 NV8xiE)h|##|Jjbt96JC2 diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp b/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp index 106f6e2..666cf9a 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp +++ b/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/main.cpp @@ -5,7 +5,7 @@ // // This code will work only if you selected window, graphics and audio. // -// In order to load the resources like cute_image.png, you have to set up +// In order to load the resources like background.png, you have to set up // your target scheme: // // - Select "Edit Scheme…" in the "Product" menu; @@ -32,14 +32,14 @@ int main(int argc, char const** argv) // Load a sprite to display sf::Texture texture; - if (!texture.loadFromFile("cute_image.jpg")) { + if (!texture.loadFromFile("background.jpg")) { return EXIT_FAILURE; } sf::Sprite sprite(texture); // Create a graphical text to display sf::Font font; - if (!font.loadFromFile("sansation.ttf")) { + if (!font.loadFromFile("tuffy.ttf")) { return EXIT_FAILURE; } sf::Text text("Hello SFML", font, 50); @@ -47,7 +47,7 @@ int main(int argc, char const** argv) // Load a music to play sf::Music music; - if (!music.openFromFile("nice_music.ogg")) { + if (!music.openFromFile("doodle_pop.ogg")) { return EXIT_FAILURE; } diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/nice_music.ogg b/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/nice_music.ogg deleted file mode 100644 index f764d61db05f2f2516f491e615f0afb2d51ef2af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153776 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 Tx%Yr^KOg32zryX%d+6l?8x!SD diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/sansation.ttf b/extern/sfml/tools/xcode/templates/SFML/SFML CLT.xctemplate/sansation.ttf deleted file mode 100644 index d85fbc81d91e22c647a3338a37f24a9d684dcf8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28912 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 Y(-osHj2F<;P%p3rF{>lYhrW~jFV!_TuK)l5 diff --git a/extern/sfml/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in b/extern/sfml/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in index 24f278b..725ffea 100644 --- a/extern/sfml/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in +++ b/extern/sfml/tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in @@ -3,7 +3,7 @@