From: Brendan Hansen Date: Fri, 20 May 2022 17:14:54 +0000 (-0500) Subject: onyx-pkg bugfix; removed modules that moved to onyxlang.io/repo X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=456f85b26ddadc03c5701d0dd2aa5a40fc69cbe2;p=onyx.git onyx-pkg bugfix; removed modules that moved to onyxlang.io/repo --- diff --git a/modules/glfw3/build.bat b/modules/glfw3/build.bat deleted file mode 100644 index 14f1f40d..00000000 --- a/modules/glfw3/build.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off - -call "tools\dev.bat" - -cl /MT /std:c17 /TC /I include /I lib/common/include /IC:\tools\glfw-3.3.5.bin.WIN64\include /D_USRDLL /D_WINDLL modules\glfw3\onyx_glfw3.c /link C:\tools\glfw-3.3.5.bin.WIN64\lib-vc2019\glfw3dll.lib opengl32.lib ws2_32.lib Advapi32.lib userenv.lib bcrypt.lib libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib /DLL /OUT:onyx_glfw3.dll - -del onyx_glfw3.obj -del onyx_glfw3.lib -del onyx_glfw3.exp \ No newline at end of file diff --git a/modules/glfw3/build.onyx b/modules/glfw3/build.onyx deleted file mode 100644 index fb47c85e..00000000 --- a/modules/glfw3/build.onyx +++ /dev/null @@ -1,101 +0,0 @@ -#load "core/std" -#load "scripts/c_binding" -#load "scripts/c_library" -#load "./module" - -use package core -use package c_binding - -main :: () { - path := module_path(#file); - - c_file_path := string.concat(path, "onyx_glfw3.c"); - - result := build_c_binding(.{ - output_file = c_file_path, - foreign_block = (package glfw3).foreign_block, - - cast_map = .[ - .{ (package glfw3).GLFWmonitor_p, "GLFWmonitor *" }, - .{ (package glfw3).GLFWwindow_p, "GLFWwindow *" }, - .{ (package glfw3).GLFWcursor_p, "GLFWcursor *" }, - ], - - preamble = .[ -""" -#include - -#define __glfwGetLoadProcAddress() (unsigned long long) &glfwGetProcAddress - -#define _EXPAND(...) __VA_ARGS__ -#define GLFW_HOOK(callback_name, c_args, wasm_args) \ - static wasm_func_t* __glfw_callback_##callback_name ; \ - static void __glfw_##callback_name (GLFWwindow *window, _EXPAND c_args) { \ - wasm_val_t args[] = { WASM_I64_VAL((unsigned long long) window), _EXPAND wasm_args }; \ - wasm_val_vec_t args_array = WASM_ARRAY_VEC(args); \ - wasm_val_vec_t results = WASM_EMPTY_VEC; \ - runtime->wasm_func_call(__glfw_callback_##callback_name , &args_array, &results); \ - } \ - ONYX_DEF(callback_name, (LONG, PTR, INT), ()) { \ - GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; \ - char name[512]; \ - strncpy(name, ONYX_PTR(params->data[1].of.i32), params->data[2].of.i32); \ - name[params->data[2].of.i32] = '\\0'; \ - __glfw_callback_##callback_name = runtime->wasm_extern_as_func(runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, name)); \ - callback_name(window, __glfw_##callback_name); \ - return NULL; \ - } -""" - ], - - custom_implementations = .[ - .{ "glfwSetKeyCallback", """ - GLFW_HOOK(glfwSetKeyCallback, (int key, int scancode, int actions, int mods), - (WASM_I32_VAL(key), WASM_I32_VAL(scancode), WASM_I32_VAL(actions), WASM_I32_VAL(mods)))""" - }, - .{ "glfwSetCharCallback", """ - GLFW_HOOK(glfwSetCharCallback, (unsigned int ch), - (WASM_I32_VAL(ch)))""" - }, - .{ "glfwSetCharModsCallback", """ - GLFW_HOOK(glfwSetCharModsCallback, (unsigned int ch, int mods), - (WASM_I32_VAL(ch), WASM_I32_VAL(mods)))""" - }, - .{ "glfwSetMouseButtonCallback", """ - GLFW_HOOK(glfwSetMouseButtonCallback, (int button, int action, int mods), - (WASM_I32_VAL(button), WASM_I32_VAL(action), WASM_I32_VAL(mods)))""" - }, - .{ "glfwSetCursorPosCallback", """ - GLFW_HOOK(glfwSetCursorPosCallback, (double xpos, double ypos), - (WASM_F64_VAL(xpos), WASM_F64_VAL(ypos)))""" - }, - .{ "glfwSetCursorEnterCallback", """ - GLFW_HOOK(glfwSetCursorEnterCallback, (int entered), - (WASM_I32_VAL(entered)))""" - }, - .{ "glfwSetScrollCallback", """ - GLFW_HOOK(glfwSetScrollCallback, (double dx, double dy), - (WASM_F64_VAL(dx), WASM_F64_VAL(dy)))""" - }, - .{ "glfwSetWindowSizeCallback", """ - GLFW_HOOK(glfwSetWindowSizeCallback, (int width, int height), - (WASM_I32_VAL(width), WASM_I32_VAL(height)))""" - }, - ], - }); - - if !result { - println("Failed to make c-file."); - os.exit(1); - } else { - println("Sucessfully made glfw3.c"); - } - - result = compile_c_file(c_file_path, string.concat(path, "onyx_glfw3.so"), libraries=.["glfw"]); - if !result { - println("Failed to compile glfw3.c"); - os.exit(1); - } else { - println("Successfully made onyx_glfw3.so"); - } -} diff --git a/modules/glfw3/module.onyx b/modules/glfw3/module.onyx deleted file mode 100644 index 76b8e777..00000000 --- a/modules/glfw3/module.onyx +++ /dev/null @@ -1,457 +0,0 @@ -package glfw3 - -use package core { cptr } - -#if #defined((package runtime).Generated_Foreign_Info) { - foreign_block :: __foreign_block -} else { - #library "onyx_glfw3" -} - -// Opaque types that are only used by pointer -GLFWmonitor_p :: #distinct u64 -GLFWwindow_p :: #distinct u64 -GLFWcursor_p :: #distinct u64 - -GLFWimage :: struct #size 16 { - width, height: i32; - pixels: ^u8; -} - -GLFWgamepadstate :: struct { - buttons: [15] u8; - axes: [6] f32; -} - -GLFWvidmode :: struct { - width, height: i32; - redBits, greenBits, blueBits, refreshRate: i32; -} - -GLFWgammaramp :: struct { - red: ^i32; - green: ^i32; - blue: ^i32; - size: i32; -} - -#local __foreign_block :: #foreign "onyx_glfw3" { - glfwInit :: () -> bool --- - glfwTerminate :: () -> void --- - glfwInitHint :: (hint, value: i32) -> void --- - glfwGetVersion :: (major, minor, rev: ^i32) -> void --- - glfwGetError :: (description: ^cptr(u8)) -> void --- - // glfwSetErrorCallback :: (f: (i32, cstr) -> void) -> void --- - - glfwMakeContextCurrent :: (window: GLFWwindow_p) -> void --- - glfwGetCurrentContext :: () -> GLFWwindow_p --- - glfwSwapInterval :: (interval: i32) -> void --- - glfwExtensionSupported :: (name: cstr) -> bool --- - - glfwGetInputMode :: (window: GLFWwindow_p, mode: i32) -> i32 --- - glfwSetInputMode :: (window: GLFWwindow_p, mode, value: i32) -> void --- - glfwRawMouseMotionSupported :: () -> i32 --- - glfwGetKeyName :: (key, scancode: i32) -> cptr(u8) --- - glfwGetKeyScancode :: (key: i32) -> i32 --- - glfwGetKey :: (window: GLFWwindow_p, key: i32) -> i32 --- - glfwGetMouseButton :: (window: GLFWwindow_p, button: i32) -> i32 --- - glfwGetCursorPos :: (window: GLFWwindow_p, xpos, ypos: ^f64) -> void --- - glfwSetCursorPos :: (window: GLFWwindow_p, xpos, ypos: f64) -> void --- - glfwCreateCursor :: (image: ^GLFWimage, xhot, yhot: i32) -> GLFWcursor_p --- - glfwCreateStandardCursor :: (shape: i32) -> GLFWcursor_p --- - glfwDestroyCursor :: (cursor: GLFWcursor_p) -> void --- - glfwSetCursor :: (window: GLFWwindow_p, cursor: GLFWcursor_p) -> void --- - glfwSetKeyCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - glfwSetCharCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - glfwSetCharModsCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - glfwSetMouseButtonCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - glfwSetCursorPosCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - glfwSetCursorEnterCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - glfwSetScrollCallback :: (window: GLFWwindow_p, export_name: str) -> void --- - // glfwSetDropCallback - glfwJoystickPresent :: (jid: i32) -> i32 --- - glfwGetJoystickAxes :: (jid: i32, count: ^i32) -> cptr(f32) --- - glfwGetJoystickButtons :: (jid: i32, count: ^i32) -> cptr(u8) --- - glfwGetJoystickHats :: (jid: i32, count: ^i32) -> cptr(u8) --- - glfwGetJoystickName :: (jid: i32) -> cptr(u8) --- - glfwGetJoystickGUID :: (jid: i32) -> cptr(u8) --- - glfwSetJoystickUserPointer :: (jid: i32, pointer: rawptr) -> void --- - glfwGetJoystickUserPointer :: (jid: i32) -> rawptr --- - glfwJoystickIsGamepad :: (jid: i32) -> i32 --- - // glfwSetJoystickCallback - glfwUpdateGamepadMappings :: (string: cstr) -> i32 --- - glfwGetGamepadName :: (jid: i32) -> cptr(u8) --- - glfwGetGamepadState :: (jid: i32, state: ^GLFWgamepadstate) -> i32 --- - glfwSetClipboardString :: (window: GLFWwindow_p, string: cstr) -> void --- - glfwGetClipboardString :: (window: GLFWwindow_p) -> cptr(u8) --- - glfwGetTime :: () -> f64 --- - glfwSetTime :: (time: f64) -> void --- - glfwGetTimerValue :: () -> u64 --- - glfwGetTimerFrequency :: () -> u64 --- - - glfwGetMonitors :: (out_count: ^i32) -> cptr(GLFWmonitor_p) --- - glfwGetPrimaryMonitor :: () -> GLFWmonitor_p --- - glfwGetMonitorPos :: (monitor: GLFWmonitor_p, xpos, ypos: ^i32) -> void --- - glfwGetMonitorWorkarea :: (monitor: GLFWmonitor_p, xpos, ypos, width, height: ^i32) -> void --- - glfwGetMonitorPhysicalSize :: (monitor: GLFWmonitor_p, widthMM, heightMM: ^i32) -> void --- - glfwGetMonitorContentScale :: (monitor: GLFWmonitor_p, xscale, yscale: ^f32) -> void --- - glfwGetMonitorName :: (monitor: GLFWmonitor_p) -> cptr(u8) --- - glfwSetMonitorUserPointer :: (monitor: GLFWmonitor_p, pointer: rawptr) -> void --- - glfwGetMonitorUserPointer :: (monitor: GLFWmonitor_p) -> rawptr --- - // glfwSetMonitorCallback - glfwGetVideoModes :: (monitor: GLFWmonitor_p, out_count: ^i32) -> cptr(GLFWvidmode) --- - glfwGetVideoMode :: (monitor: GLFWmonitor_p) -> cptr(GLFWvidmode) --- - glfwSetGamma :: (monitor: GLFWmonitor_p, gamma: f32) -> void --- - // glfwGetGammaRamp :: (monitor: GLFWmonitor_p, out_ramp: ^GLFWgammramp) -> void --- - // glfwSetGammaRamp :: (monitor: GLFWmonitor_p, ramp: ^GLFWgammramp) -> void --- - - - glfwCreateWindow :: (width, height: i32, title: cstr, monitor: GLFWmonitor_p = 0, share: GLFWwindow_p = 0) -> GLFWwindow_p --- - glfwDestroyWindow :: (window: GLFWwindow_p) -> void --- - glfwWindowShouldClose :: (window: GLFWwindow_p) -> bool --- - glfwSetWindowShouldClose :: (window: GLFWwindow_p, value: bool) -> void --- - glfwDefaultWindowHints :: () -> void --- - glfwWindowHint :: (hint: i32, value: i32) -> void --- - glfwSetWindowTitle :: (window: GLFWwindow_p, title: cstr) -> void --- - glfwSetWindowIcon :: (window: GLFWwindow_p, count: i32, images: ^GLFWimage) -> void --- - glfwGetWindowPos :: (window: GLFWwindow_p, xpos, ypos: ^i32) -> void --- - glfwSetWindowPos :: (window: GLFWwindow_p, xpos, ypos: i32) -> void --- - glfwGetWindowSize :: (window: GLFWwindow_p, xpos, ypos: ^i32) -> void --- - glfwSetWindowSize :: (window: GLFWwindow_p, xpos, ypos: i32) -> void --- - glfwSetWindowSizeLimits :: (window: GLFWwindow_p, minwidth, minheight, maxwidth, maxheight: i32) -> void --- - glfwSetWindowAspectRatio :: (window: GLFWwindow_p, numer, denom: i32) -> void --- - glfwGetFramebufferSize :: (window: GLFWwindow_p, width, height: ^i32) -> void --- - glfwGetWindowFrameSize :: (window: GLFWwindow_p, left, top, right, bottom: ^i32) -> void --- - glfwIconifyWindow :: (window: GLFWwindow_p) -> void --- - glfwRestoreWindow :: (window: GLFWwindow_p) -> void --- - glfwMaximizeWindow :: (window: GLFWwindow_p) -> void --- - glfwShowWindow :: (window: GLFWwindow_p) -> void --- - glfwHideWindow :: (window: GLFWwindow_p) -> void --- - glfwFocusWindow :: (window: GLFWwindow_p) -> void --- - glfwGetWindowMonitor :: (window: GLFWwindow_p) -> GLFWmonitor_p --- - glfwSetWindowMonitor :: (window: GLFWwindow_p, monitor: GLFWmonitor_p, x, y, width, height, refreshRate: i32) -> void --- - glfwGetWindowAttrib :: (window: GLFWwindow_p, attrib: i32) -> i32 --- - glfwSetWindowUserPointer :: (window: GLFWwindow_p, ptr: rawptr) -> void --- - glfwGetWindowUserPointer :: (window: GLFWwindow_p) -> rawptr --- - glfwPollEvents :: () -> void --- - glfwWaitEvents :: () -> void --- - glfwWaitEventsTimeout :: (timeout: f64) -> void --- - glfwPostEmptyEvent :: () -> void --- - glfwSwapBuffers :: (window: GLFWwindow_p) -> void --- - glfwSetWindowSizeCallback :: (window: GLFWwindow_p, name: str) -> void --- - #local __glfwGetLoadProcAddress :: () -> u64 --- -} - -// This should always be defined right? -#if #defined(package opengles) { - use package opengles { GLGetProcAddress } - glfwGetLoadProcAddress :: macro () -> GLGetProcAddress { - __glfwGetLoadProcAddress :: __glfwGetLoadProcAddress - return ~~ __glfwGetLoadProcAddress(); - } -} - - -GLFW_FOCUSED :: 0x00020001; -GLFW_ICONIFIED :: 0x00020002; -GLFW_RESIZABLE :: 0x00020003; -GLFW_VISIBLE :: 0x00020004; -GLFW_DECORATED :: 0x00020005; -GLFW_AUTO_ICONIFY :: 0x00020006; -GLFW_FLOATING :: 0x00020007; -GLFW_MAXIMIZED :: 0x00020008; -GLFW_CENTER_CURSOR :: 0x00020009; -GLFW_TRANSPARENT_FRAMEBUFFER :: 0x0002000A; -GLFW_HOVERED :: 0x0002000B; -GLFW_FOCUS_ON_SHOW :: 0x0002000C; -GLFW_RED_BITS :: 0x00021001; -GLFW_GREEN_BITS :: 0x00021002; -GLFW_BLUE_BITS :: 0x00021003; -GLFW_ALPHA_BITS :: 0x00021004; -GLFW_DEPTH_BITS :: 0x00021005; -GLFW_STENCIL_BITS :: 0x00021006; -GLFW_ACCUM_RED_BITS :: 0x00021007; -GLFW_ACCUM_GREEN_BITS :: 0x00021008; -GLFW_ACCUM_BLUE_BITS :: 0x00021009; -GLFW_ACCUM_ALPHA_BITS :: 0x0002100A; -GLFW_AUX_BUFFERS :: 0x0002100B; -GLFW_STEREO :: 0x0002100C; -GLFW_SAMPLES :: 0x0002100D; -GLFW_SRGB_CAPABLE :: 0x0002100E; -GLFW_REFRESH_RATE :: 0x0002100F; -GLFW_DOUBLEBUFFER :: 0x00021010; -GLFW_CLIENT_API :: 0x00022001; -GLFW_CONTEXT_VERSION_MAJOR :: 0x00022002; -GLFW_CONTEXT_VERSION_MINOR :: 0x00022003; -GLFW_CONTEXT_REVISION :: 0x00022004; -GLFW_CONTEXT_ROBUSTNESS :: 0x00022005; -GLFW_OPENGL_FORWARD_COMPAT :: 0x00022006; -GLFW_OPENGL_DEBUG_CONTEXT :: 0x00022007; -GLFW_OPENGL_PROFILE :: 0x00022008; -GLFW_CONTEXT_RELEASE_BEHAVIOR :: 0x00022009; - -GLFW_NO_API :: 0; -GLFW_OPENGL_API :: 0x00030001; -GLFW_OPENGL_ES_API :: 0x00030002; - -GLFW_NO_ROBUSTNESS :: 0; -GLFW_NO_RESET_NOTIFICATION :: 0x00031001; -GLFW_LOSE_CONTEXT_ON_RESET :: 0x00031002; - -GLFW_OPENGL_ANY_PROFILE :: 0; -GLFW_OPENGL_CORE_PROFILE :: 0x00032001; -GLFW_OPENGL_COMPAT_PROFILE :: 0x00032002; - -GLFW_CURSOR :: 0x00033001; -GLFW_STICKY_KEYS :: 0x00033002; -GLFW_STICKY_MOUSE_BUTTONS :: 0x00033003; -GLFW_LOCK_KEY_MODS :: 0x00033004; -GLFW_RAW_MOUSE_MOTION :: 0x00033005; - -GLFW_CURSOR_NORMAL :: 0x00034001; -GLFW_CURSOR_HIDDEN :: 0x00034002; -GLFW_CURSOR_DISABLED :: 0x00034003; - -GLFW_ANY_RELEASE_BEHAVIOR :: 0; -GLFW_RELEASE_BEHAVIOR_FLUSH :: 0x00035001; -GLFW_RELEASE_BEHAVIOR_NONE :: 0x00035002; - -GLFW_NATIVE_CONTEXT_API :: 0x00036001; -GLFW_EGL_CONTEXT_API :: 0x00036002; -GLFW_OSMESA_CONTEXT_API :: 0x00036003; - -GLFW_ARROW_CURSOR :: 0x00036001 -GLFW_IBEAM_CURSOR :: 0x00036002 -GLFW_CROSSHAIR_CURSOR :: 0x00036003 -GLFW_HAND_CURSOR :: 0x00036004 -GLFW_HRESIZE_CURSOR :: 0x00036005 -GLFW_VRESIZE_CURSOR :: 0x00036006 -GLFW_CONNECTED :: 0x00040001 -GLFW_DISCONNECTED :: 0x00040002 -GLFW_JOYSTICK_HAT_BUTTONS :: 0x00050001 -GLFW_COCOA_CHDIR_RESOURCES :: 0x00051001 -GLFW_COCOA_MENUBAR :: 0x00051002 -GLFW_DONT_CARE :: -1 - -GLFW_VERSION_MAJOR :: 3 -GLFW_VERSION_MINOR :: 3 -GLFW_VERSION_REVISION :: 5 -GLFW_TRUE :: 1 -GLFW_FALSE :: 0 - -GLFW_RELEASE :: 0 -GLFW_PRESS :: 1 -GLFW_REPEAT :: 2 - -GLFW_HAT_CENTERED :: 0 -GLFW_HAT_UP :: 1 -GLFW_HAT_RIGHT :: 2 -GLFW_HAT_DOWN :: 4 -GLFW_HAT_LEFT :: 8 -GLFW_HAT_RIGHT_UP :: GLFW_HAT_RIGHT | GLFW_HAT_UP -GLFW_HAT_RIGHT_DOWN :: GLFW_HAT_RIGHT | GLFW_HAT_DOWN -GLFW_HAT_LEFT_UP :: GLFW_HAT_LEFT | GLFW_HAT_UP -GLFW_HAT_LEFT_DOWN :: GLFW_HAT_LEFT | GLFW_HAT_DOWN - -GLFW_KEY_UNKNOWN :: -1 - -GLFW_KEY_SPACE :: 32 -GLFW_KEY_APOSTROPHE :: 39 /* ' */ -GLFW_KEY_COMMA :: 44 /* , */ -GLFW_KEY_MINUS :: 45 /* - */ -GLFW_KEY_PERIOD :: 46 /* . */ -GLFW_KEY_SLASH :: 47 /* / */ -GLFW_KEY_0 :: 48 -GLFW_KEY_1 :: 49 -GLFW_KEY_2 :: 50 -GLFW_KEY_3 :: 51 -GLFW_KEY_4 :: 52 -GLFW_KEY_5 :: 53 -GLFW_KEY_6 :: 54 -GLFW_KEY_7 :: 55 -GLFW_KEY_8 :: 56 -GLFW_KEY_9 :: 57 -GLFW_KEY_SEMICOLON :: 59 /* ; */ -GLFW_KEY_EQUAL :: 61 /* = */ -GLFW_KEY_A :: 65 -GLFW_KEY_B :: 66 -GLFW_KEY_C :: 67 -GLFW_KEY_D :: 68 -GLFW_KEY_E :: 69 -GLFW_KEY_F :: 70 -GLFW_KEY_G :: 71 -GLFW_KEY_H :: 72 -GLFW_KEY_I :: 73 -GLFW_KEY_J :: 74 -GLFW_KEY_K :: 75 -GLFW_KEY_L :: 76 -GLFW_KEY_M :: 77 -GLFW_KEY_N :: 78 -GLFW_KEY_O :: 79 -GLFW_KEY_P :: 80 -GLFW_KEY_Q :: 81 -GLFW_KEY_R :: 82 -GLFW_KEY_S :: 83 -GLFW_KEY_T :: 84 -GLFW_KEY_U :: 85 -GLFW_KEY_V :: 86 -GLFW_KEY_W :: 87 -GLFW_KEY_X :: 88 -GLFW_KEY_Y :: 89 -GLFW_KEY_Z :: 90 -GLFW_KEY_LEFT_BRACKET :: 91 /* [ */ -GLFW_KEY_BACKSLASH :: 92 /* \ */ -GLFW_KEY_RIGHT_BRACKET :: 93 /* ] */ -GLFW_KEY_GRAVE_ACCENT :: 96 /* ` */ -GLFW_KEY_WORLD_1 :: 161 /* non-US #1 */ -GLFW_KEY_WORLD_2 :: 162 /* non-US #2 */ - -GLFW_KEY_ESCAPE :: 256 -GLFW_KEY_ENTER :: 257 -GLFW_KEY_TAB :: 258 -GLFW_KEY_BACKSPACE :: 259 -GLFW_KEY_INSERT :: 260 -GLFW_KEY_DELETE :: 261 -GLFW_KEY_RIGHT :: 262 -GLFW_KEY_LEFT :: 263 -GLFW_KEY_DOWN :: 264 -GLFW_KEY_UP :: 265 -GLFW_KEY_PAGE_UP :: 266 -GLFW_KEY_PAGE_DOWN :: 267 -GLFW_KEY_HOME :: 268 -GLFW_KEY_END :: 269 -GLFW_KEY_CAPS_LOCK :: 280 -GLFW_KEY_SCROLL_LOCK :: 281 -GLFW_KEY_NUM_LOCK :: 282 -GLFW_KEY_PRINT_SCREEN :: 283 -GLFW_KEY_PAUSE :: 284 -GLFW_KEY_F1 :: 290 -GLFW_KEY_F2 :: 291 -GLFW_KEY_F3 :: 292 -GLFW_KEY_F4 :: 293 -GLFW_KEY_F5 :: 294 -GLFW_KEY_F6 :: 295 -GLFW_KEY_F7 :: 296 -GLFW_KEY_F8 :: 297 -GLFW_KEY_F9 :: 298 -GLFW_KEY_F10 :: 299 -GLFW_KEY_F11 :: 300 -GLFW_KEY_F12 :: 301 -GLFW_KEY_F13 :: 302 -GLFW_KEY_F14 :: 303 -GLFW_KEY_F15 :: 304 -GLFW_KEY_F16 :: 305 -GLFW_KEY_F17 :: 306 -GLFW_KEY_F18 :: 307 -GLFW_KEY_F19 :: 308 -GLFW_KEY_F20 :: 309 -GLFW_KEY_F21 :: 310 -GLFW_KEY_F22 :: 311 -GLFW_KEY_F23 :: 312 -GLFW_KEY_F24 :: 313 -GLFW_KEY_F25 :: 314 -GLFW_KEY_KP_0 :: 320 -GLFW_KEY_KP_1 :: 321 -GLFW_KEY_KP_2 :: 322 -GLFW_KEY_KP_3 :: 323 -GLFW_KEY_KP_4 :: 324 -GLFW_KEY_KP_5 :: 325 -GLFW_KEY_KP_6 :: 326 -GLFW_KEY_KP_7 :: 327 -GLFW_KEY_KP_8 :: 328 -GLFW_KEY_KP_9 :: 329 -GLFW_KEY_KP_DECIMAL :: 330 -GLFW_KEY_KP_DIVIDE :: 331 -GLFW_KEY_KP_MULTIPLY :: 332 -GLFW_KEY_KP_SUBTRACT :: 333 -GLFW_KEY_KP_ADD :: 334 -GLFW_KEY_KP_ENTER :: 335 -GLFW_KEY_KP_EQUAL :: 336 -GLFW_KEY_LEFT_SHIFT :: 340 -GLFW_KEY_LEFT_CONTROL :: 341 -GLFW_KEY_LEFT_ALT :: 342 -GLFW_KEY_LEFT_SUPER :: 343 -GLFW_KEY_RIGHT_SHIFT :: 344 -GLFW_KEY_RIGHT_CONTROL :: 345 -GLFW_KEY_RIGHT_ALT :: 346 -GLFW_KEY_RIGHT_SUPER :: 347 -GLFW_KEY_MENU :: 348 - -GLFW_KEY_LAST :: GLFW_KEY_MENU -GLFW_MOD_SHIFT :: 0x0001 -GLFW_MOD_CONTROL :: 0x0002 -GLFW_MOD_ALT :: 0x0004 -GLFW_MOD_SUPER :: 0x0008 -GLFW_MOD_CAPS_LOCK :: 0x0010 -GLFW_MOD_NUM_LOCK :: 0x0020 - -GLFW_MOUSE_BUTTON_1 :: 0 -GLFW_MOUSE_BUTTON_2 :: 1 -GLFW_MOUSE_BUTTON_3 :: 2 -GLFW_MOUSE_BUTTON_4 :: 3 -GLFW_MOUSE_BUTTON_5 :: 4 -GLFW_MOUSE_BUTTON_6 :: 5 -GLFW_MOUSE_BUTTON_7 :: 6 -GLFW_MOUSE_BUTTON_8 :: 7 -GLFW_MOUSE_BUTTON_LAST :: GLFW_MOUSE_BUTTON_8 -GLFW_MOUSE_BUTTON_LEFT :: GLFW_MOUSE_BUTTON_1 -GLFW_MOUSE_BUTTON_RIGHT :: GLFW_MOUSE_BUTTON_2 -GLFW_MOUSE_BUTTON_MIDDLE :: GLFW_MOUSE_BUTTON_3 -GLFW_JOYSTICK_1 :: 0 -GLFW_JOYSTICK_2 :: 1 -GLFW_JOYSTICK_3 :: 2 -GLFW_JOYSTICK_4 :: 3 -GLFW_JOYSTICK_5 :: 4 -GLFW_JOYSTICK_6 :: 5 -GLFW_JOYSTICK_7 :: 6 -GLFW_JOYSTICK_8 :: 7 -GLFW_JOYSTICK_9 :: 8 -GLFW_JOYSTICK_10 :: 9 -GLFW_JOYSTICK_11 :: 10 -GLFW_JOYSTICK_12 :: 11 -GLFW_JOYSTICK_13 :: 12 -GLFW_JOYSTICK_14 :: 13 -GLFW_JOYSTICK_15 :: 14 -GLFW_JOYSTICK_16 :: 15 -GLFW_JOYSTICK_LAST :: GLFW_JOYSTICK_16 -GLFW_GAMEPAD_BUTTON_A :: 0 -GLFW_GAMEPAD_BUTTON_B :: 1 -GLFW_GAMEPAD_BUTTON_X :: 2 -GLFW_GAMEPAD_BUTTON_Y :: 3 -GLFW_GAMEPAD_BUTTON_LEFT_BUMPER :: 4 -GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER :: 5 -GLFW_GAMEPAD_BUTTON_BACK :: 6 -GLFW_GAMEPAD_BUTTON_START :: 7 -GLFW_GAMEPAD_BUTTON_GUIDE :: 8 -GLFW_GAMEPAD_BUTTON_LEFT_THUMB :: 9 -GLFW_GAMEPAD_BUTTON_RIGHT_THUMB :: 10 -GLFW_GAMEPAD_BUTTON_DPAD_UP :: 11 -GLFW_GAMEPAD_BUTTON_DPAD_RIGHT :: 12 -GLFW_GAMEPAD_BUTTON_DPAD_DOWN :: 13 -GLFW_GAMEPAD_BUTTON_DPAD_LEFT :: 14 -GLFW_GAMEPAD_BUTTON_LAST :: GLFW_GAMEPAD_BUTTON_DPAD_LEFT - -GLFW_GAMEPAD_BUTTON_CROSS :: GLFW_GAMEPAD_BUTTON_A -GLFW_GAMEPAD_BUTTON_CIRCLE :: GLFW_GAMEPAD_BUTTON_B -GLFW_GAMEPAD_BUTTON_SQUARE :: GLFW_GAMEPAD_BUTTON_X -GLFW_GAMEPAD_BUTTON_TRIANGLE :: GLFW_GAMEPAD_BUTTON_Y -GLFW_GAMEPAD_AXIS_LEFT_X :: 0 -GLFW_GAMEPAD_AXIS_LEFT_Y :: 1 -GLFW_GAMEPAD_AXIS_RIGHT_X :: 2 -GLFW_GAMEPAD_AXIS_RIGHT_Y :: 3 -GLFW_GAMEPAD_AXIS_LEFT_TRIGGER :: 4 -GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER :: 5 -GLFW_GAMEPAD_AXIS_LAST :: GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER - -GLFW_NO_ERROR :: 0 -GLFW_NOT_INITIALIZED :: 0x00010001 -GLFW_NO_CURRENT_CONTEXT :: 0x00010002 -GLFW_INVALID_ENUM :: 0x00010003 -GLFW_INVALID_VALUE :: 0x00010004 -GLFW_OUT_OF_MEMORY :: 0x00010005 -GLFW_API_UNAVAILABLE :: 0x00010006 -GLFW_VERSION_UNAVAILABLE :: 0x00010007 -GLFW_PLATFORM_ERROR :: 0x00010008 -GLFW_FORMAT_UNAVAILABLE :: 0x00010009 -GLFW_NO_WINDOW_CONTEXT :: 0x0001000A - diff --git a/modules/glfw3/onyx_glfw3.c b/modules/glfw3/onyx_glfw3.c deleted file mode 100644 index 02e77ef2..00000000 --- a/modules/glfw3/onyx_glfw3.c +++ /dev/null @@ -1,580 +0,0 @@ -// -// THIS FILE WAS AUTOMATICALLY GENERATED. -// - -#include - -#define __glfwGetLoadProcAddress() (unsigned long long) &glfwGetProcAddress - -#define _EXPAND(...) __VA_ARGS__ -#define GLFW_HOOK(callback_name, c_args, wasm_args) \ - static wasm_func_t* __glfw_callback_##callback_name ; \ - static void __glfw_##callback_name (GLFWwindow *window, _EXPAND c_args) { \ - wasm_val_t args[] = { WASM_I64_VAL((unsigned long long) window), _EXPAND wasm_args }; \ - wasm_val_vec_t args_array = WASM_ARRAY_VEC(args); \ - wasm_val_vec_t results = WASM_EMPTY_VEC; \ - runtime->wasm_func_call(__glfw_callback_##callback_name , &args_array, &results); \ - } \ - ONYX_DEF(callback_name, (LONG, PTR, INT), ()) { \ - GLFWwindow *window = (GLFWwindow *) params->data[0].of.i64; \ - char name[512]; \ - strncpy(name, ONYX_PTR(params->data[1].of.i32), params->data[2].of.i32); \ - name[params->data[2].of.i32] = '\0'; \ - __glfw_callback_##callback_name = runtime->wasm_extern_as_func(runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, name)); \ - callback_name(window, __glfw_##callback_name); \ - return NULL; \ - } - - -#define ONYX_LIBRARY_NAME onyx_glfw3 -#include "onyx_library.h" - -#define P(i, k) (params->data[i].of.k) - -ONYX_DEF(glfwInit, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwInit()); - return NULL; -} - -ONYX_DEF(glfwTerminate, (), ()) { - glfwTerminate(); - return NULL; -} - -ONYX_DEF(glfwInitHint, (WASM_I32, WASM_I32), ()) { - glfwInitHint(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glfwGetVersion, (WASM_I32, WASM_I32, WASM_I32), ()) { - glfwGetVersion(ONYX_PTR(P(0, i32)), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwGetError, (WASM_I32), ()) { - glfwGetError(ONYX_PTR(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwMakeContextCurrent, (WASM_I64), ()) { - glfwMakeContextCurrent((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwGetCurrentContext, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetCurrentContext()); - return NULL; -} - -ONYX_DEF(glfwSwapInterval, (WASM_I32), ()) { - glfwSwapInterval(P(0, i32)); - return NULL; -} - -ONYX_DEF(glfwExtensionSupported, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwExtensionSupported(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetInputMode, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetInputMode((GLFWwindow *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwSetInputMode, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwSetInputMode((GLFWwindow *) P(0, i64), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glfwRawMouseMotionSupported, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwRawMouseMotionSupported()); - return NULL; -} - -ONYX_DEF(glfwGetKeyName, (WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetKeyName(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetKeyScancode, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetKeyScancode(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwGetKey, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetKey((GLFWwindow *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetMouseButton, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetMouseButton((GLFWwindow *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetCursorPos, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetCursorPos((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwSetCursorPos, (WASM_I64, WASM_F64, WASM_F64), ()) { - glfwSetCursorPos((GLFWwindow *) P(0, i64), P(1, f64), P(2, f64)); - return NULL; -} - -ONYX_DEF(glfwCreateCursor, (WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwCreateCursor(ONYX_PTR(P(0, i32)), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwCreateStandardCursor, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwCreateStandardCursor(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwDestroyCursor, (WASM_I64), ()) { - glfwDestroyCursor((GLFWcursor *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwSetCursor, (WASM_I64, WASM_I64), ()) { - glfwSetCursor((GLFWwindow *) P(0, i64), (GLFWcursor *) P(1, i64)); - return NULL; -} - - - GLFW_HOOK(glfwSetKeyCallback, (int key, int scancode, int actions, int mods), - (WASM_I32_VAL(key), WASM_I32_VAL(scancode), WASM_I32_VAL(actions), WASM_I32_VAL(mods))) - - GLFW_HOOK(glfwSetCharCallback, (unsigned int ch), - (WASM_I32_VAL(ch))) - - GLFW_HOOK(glfwSetCharModsCallback, (unsigned int ch, int mods), - (WASM_I32_VAL(ch), WASM_I32_VAL(mods))) - - GLFW_HOOK(glfwSetMouseButtonCallback, (int button, int action, int mods), - (WASM_I32_VAL(button), WASM_I32_VAL(action), WASM_I32_VAL(mods))) - - GLFW_HOOK(glfwSetCursorPosCallback, (double xpos, double ypos), - (WASM_F64_VAL(xpos), WASM_F64_VAL(ypos))) - - GLFW_HOOK(glfwSetCursorEnterCallback, (int entered), - (WASM_I32_VAL(entered))) - - GLFW_HOOK(glfwSetScrollCallback, (double dx, double dy), - (WASM_F64_VAL(dx), WASM_F64_VAL(dy))) -ONYX_DEF(glfwJoystickPresent, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwJoystickPresent(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwGetJoystickAxes, (WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetJoystickAxes(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetJoystickButtons, (WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetJoystickButtons(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetJoystickHats, (WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetJoystickHats(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetJoystickName, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetJoystickName(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwGetJoystickGUID, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetJoystickGUID(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwSetJoystickUserPointer, (WASM_I32, WASM_I32), ()) { - glfwSetJoystickUserPointer(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetJoystickUserPointer, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetJoystickUserPointer(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwJoystickIsGamepad, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwJoystickIsGamepad(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwUpdateGamepadMappings, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwUpdateGamepadMappings(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetGamepadName, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetGamepadName(P(0, i32))); - return NULL; -} - -ONYX_DEF(glfwGetGamepadState, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetGamepadState(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glfwSetClipboardString, (WASM_I64, WASM_I32), ()) { - glfwSetClipboardString((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetClipboardString, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetClipboardString((GLFWwindow *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwGetTime, (), (WASM_F64)) { - results->data[0] = WASM_F64_VAL(glfwGetTime()); - return NULL; -} - -ONYX_DEF(glfwSetTime, (WASM_F64), ()) { - glfwSetTime(P(0, f64)); - return NULL; -} - -ONYX_DEF(glfwGetTimerValue, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetTimerValue()); - return NULL; -} - -ONYX_DEF(glfwGetTimerFrequency, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetTimerFrequency()); - return NULL; -} - -ONYX_DEF(glfwGetMonitors, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetMonitors(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetPrimaryMonitor, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetPrimaryMonitor()); - return NULL; -} - -ONYX_DEF(glfwGetMonitorPos, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetMonitorPos((GLFWmonitor *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwGetMonitorWorkarea, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glfwGetMonitorWorkarea((GLFWmonitor *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(glfwGetMonitorPhysicalSize, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetMonitorPhysicalSize((GLFWmonitor *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwGetMonitorContentScale, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetMonitorContentScale((GLFWmonitor *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwGetMonitorName, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetMonitorName((GLFWmonitor *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwSetMonitorUserPointer, (WASM_I64, WASM_I32), ()) { - glfwSetMonitorUserPointer((GLFWmonitor *) P(0, i64), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetMonitorUserPointer, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetMonitorUserPointer((GLFWmonitor *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwGetVideoModes, (WASM_I64, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetVideoModes((GLFWmonitor *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glfwGetVideoMode, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetVideoMode((GLFWmonitor *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwSetGamma, (WASM_I64, WASM_F32), ()) { - glfwSetGamma((GLFWmonitor *) P(0, i64), P(1, f32)); - return NULL; -} - -ONYX_DEF(glfwCreateWindow, (WASM_I32, WASM_I32, WASM_I32, WASM_I64, WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwCreateWindow(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), (GLFWmonitor *) P(3, i64), (GLFWwindow *) P(4, i64))); - return NULL; -} - -ONYX_DEF(glfwDestroyWindow, (WASM_I64), ()) { - glfwDestroyWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwWindowShouldClose, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwWindowShouldClose((GLFWwindow *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwSetWindowShouldClose, (WASM_I64, WASM_I32), ()) { - glfwSetWindowShouldClose((GLFWwindow *) P(0, i64), P(1, i32)); - return NULL; -} - -ONYX_DEF(glfwDefaultWindowHints, (), ()) { - glfwDefaultWindowHints(); - return NULL; -} - -ONYX_DEF(glfwWindowHint, (WASM_I32, WASM_I32), ()) { - glfwWindowHint(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glfwSetWindowTitle, (WASM_I64, WASM_I32), ()) { - glfwSetWindowTitle((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwSetWindowIcon, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwSetWindowIcon((GLFWwindow *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwGetWindowPos, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetWindowPos((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwSetWindowPos, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwSetWindowPos((GLFWwindow *) P(0, i64), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glfwGetWindowSize, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetWindowSize((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwSetWindowSize, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwSetWindowSize((GLFWwindow *) P(0, i64), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glfwSetWindowSizeLimits, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glfwSetWindowSizeLimits((GLFWwindow *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glfwSetWindowAspectRatio, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwSetWindowAspectRatio((GLFWwindow *) P(0, i64), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glfwGetFramebufferSize, (WASM_I64, WASM_I32, WASM_I32), ()) { - glfwGetFramebufferSize((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glfwGetWindowFrameSize, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glfwGetWindowFrameSize((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(glfwIconifyWindow, (WASM_I64), ()) { - glfwIconifyWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwRestoreWindow, (WASM_I64), ()) { - glfwRestoreWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwMaximizeWindow, (WASM_I64), ()) { - glfwMaximizeWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwShowWindow, (WASM_I64), ()) { - glfwShowWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwHideWindow, (WASM_I64), ()) { - glfwHideWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwFocusWindow, (WASM_I64), ()) { - glfwFocusWindow((GLFWwindow *) P(0, i64)); - return NULL; -} - -ONYX_DEF(glfwGetWindowMonitor, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glfwGetWindowMonitor((GLFWwindow *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwSetWindowMonitor, (WASM_I64, WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glfwSetWindowMonitor((GLFWwindow *) P(0, i64), (GLFWmonitor *) P(1, i64), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32)); - return NULL; -} - -ONYX_DEF(glfwGetWindowAttrib, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetWindowAttrib((GLFWwindow *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwSetWindowUserPointer, (WASM_I64, WASM_I32), ()) { - glfwSetWindowUserPointer((GLFWwindow *) P(0, i64), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glfwGetWindowUserPointer, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glfwGetWindowUserPointer((GLFWwindow *) P(0, i64))); - return NULL; -} - -ONYX_DEF(glfwPollEvents, (), ()) { - glfwPollEvents(); - return NULL; -} - -ONYX_DEF(glfwWaitEvents, (), ()) { - glfwWaitEvents(); - return NULL; -} - -ONYX_DEF(glfwWaitEventsTimeout, (WASM_F64), ()) { - glfwWaitEventsTimeout(P(0, f64)); - return NULL; -} - -ONYX_DEF(glfwPostEmptyEvent, (), ()) { - glfwPostEmptyEvent(); - return NULL; -} - -ONYX_DEF(glfwSwapBuffers, (WASM_I64), ()) { - glfwSwapBuffers((GLFWwindow *) P(0, i64)); - return NULL; -} - - - GLFW_HOOK(glfwSetWindowSizeCallback, (int width, int height), - (WASM_I32_VAL(width), WASM_I32_VAL(height))) -ONYX_DEF(__glfwGetLoadProcAddress, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(__glfwGetLoadProcAddress()); - return NULL; -} - - - -ONYX_LIBRARY { - ONYX_FUNC(glfwInit) - ONYX_FUNC(glfwTerminate) - ONYX_FUNC(glfwInitHint) - ONYX_FUNC(glfwGetVersion) - ONYX_FUNC(glfwGetError) - ONYX_FUNC(glfwMakeContextCurrent) - ONYX_FUNC(glfwGetCurrentContext) - ONYX_FUNC(glfwSwapInterval) - ONYX_FUNC(glfwExtensionSupported) - ONYX_FUNC(glfwGetInputMode) - ONYX_FUNC(glfwSetInputMode) - ONYX_FUNC(glfwRawMouseMotionSupported) - ONYX_FUNC(glfwGetKeyName) - ONYX_FUNC(glfwGetKeyScancode) - ONYX_FUNC(glfwGetKey) - ONYX_FUNC(glfwGetMouseButton) - ONYX_FUNC(glfwGetCursorPos) - ONYX_FUNC(glfwSetCursorPos) - ONYX_FUNC(glfwCreateCursor) - ONYX_FUNC(glfwCreateStandardCursor) - ONYX_FUNC(glfwDestroyCursor) - ONYX_FUNC(glfwSetCursor) - ONYX_FUNC(glfwSetKeyCallback) - ONYX_FUNC(glfwSetCharCallback) - ONYX_FUNC(glfwSetCharModsCallback) - ONYX_FUNC(glfwSetMouseButtonCallback) - ONYX_FUNC(glfwSetCursorPosCallback) - ONYX_FUNC(glfwSetCursorEnterCallback) - ONYX_FUNC(glfwSetScrollCallback) - ONYX_FUNC(glfwJoystickPresent) - ONYX_FUNC(glfwGetJoystickAxes) - ONYX_FUNC(glfwGetJoystickButtons) - ONYX_FUNC(glfwGetJoystickHats) - ONYX_FUNC(glfwGetJoystickName) - ONYX_FUNC(glfwGetJoystickGUID) - ONYX_FUNC(glfwSetJoystickUserPointer) - ONYX_FUNC(glfwGetJoystickUserPointer) - ONYX_FUNC(glfwJoystickIsGamepad) - ONYX_FUNC(glfwUpdateGamepadMappings) - ONYX_FUNC(glfwGetGamepadName) - ONYX_FUNC(glfwGetGamepadState) - ONYX_FUNC(glfwSetClipboardString) - ONYX_FUNC(glfwGetClipboardString) - ONYX_FUNC(glfwGetTime) - ONYX_FUNC(glfwSetTime) - ONYX_FUNC(glfwGetTimerValue) - ONYX_FUNC(glfwGetTimerFrequency) - ONYX_FUNC(glfwGetMonitors) - ONYX_FUNC(glfwGetPrimaryMonitor) - ONYX_FUNC(glfwGetMonitorPos) - ONYX_FUNC(glfwGetMonitorWorkarea) - ONYX_FUNC(glfwGetMonitorPhysicalSize) - ONYX_FUNC(glfwGetMonitorContentScale) - ONYX_FUNC(glfwGetMonitorName) - ONYX_FUNC(glfwSetMonitorUserPointer) - ONYX_FUNC(glfwGetMonitorUserPointer) - ONYX_FUNC(glfwGetVideoModes) - ONYX_FUNC(glfwGetVideoMode) - ONYX_FUNC(glfwSetGamma) - ONYX_FUNC(glfwCreateWindow) - ONYX_FUNC(glfwDestroyWindow) - ONYX_FUNC(glfwWindowShouldClose) - ONYX_FUNC(glfwSetWindowShouldClose) - ONYX_FUNC(glfwDefaultWindowHints) - ONYX_FUNC(glfwWindowHint) - ONYX_FUNC(glfwSetWindowTitle) - ONYX_FUNC(glfwSetWindowIcon) - ONYX_FUNC(glfwGetWindowPos) - ONYX_FUNC(glfwSetWindowPos) - ONYX_FUNC(glfwGetWindowSize) - ONYX_FUNC(glfwSetWindowSize) - ONYX_FUNC(glfwSetWindowSizeLimits) - ONYX_FUNC(glfwSetWindowAspectRatio) - ONYX_FUNC(glfwGetFramebufferSize) - ONYX_FUNC(glfwGetWindowFrameSize) - ONYX_FUNC(glfwIconifyWindow) - ONYX_FUNC(glfwRestoreWindow) - ONYX_FUNC(glfwMaximizeWindow) - ONYX_FUNC(glfwShowWindow) - ONYX_FUNC(glfwHideWindow) - ONYX_FUNC(glfwFocusWindow) - ONYX_FUNC(glfwGetWindowMonitor) - ONYX_FUNC(glfwSetWindowMonitor) - ONYX_FUNC(glfwGetWindowAttrib) - ONYX_FUNC(glfwSetWindowUserPointer) - ONYX_FUNC(glfwGetWindowUserPointer) - ONYX_FUNC(glfwPollEvents) - ONYX_FUNC(glfwWaitEvents) - ONYX_FUNC(glfwWaitEventsTimeout) - ONYX_FUNC(glfwPostEmptyEvent) - ONYX_FUNC(glfwSwapBuffers) - ONYX_FUNC(glfwSetWindowSizeCallback) - ONYX_FUNC(__glfwGetLoadProcAddress) - NULL -}; \ No newline at end of file diff --git a/modules/glfw3/onyx_glfw3.so b/modules/glfw3/onyx_glfw3.so deleted file mode 100755 index 168d7223..00000000 Binary files a/modules/glfw3/onyx_glfw3.so and /dev/null differ diff --git a/modules/http/README.md b/modules/http/README.md deleted file mode 100644 index c8e9da0a..00000000 --- a/modules/http/README.md +++ /dev/null @@ -1,10 +0,0 @@ - -# HTTP library -Minimal implementation of HTTP/1.0 and HTTP/1.1 protocols. - -## What this module is and isn't -For now, this module is solely meant for making HTTP requests, -NOT for making an HTTP server. An HTTP server implementation may -be coming, but for now I think HTTP requests are more universally -useful. They enable a programmer to interact with a whole host of -online services, making Onyx more powerful for application development. diff --git a/modules/http/headers.onyx b/modules/http/headers.onyx deleted file mode 100644 index 2151ac55..00000000 --- a/modules/http/headers.onyx +++ /dev/null @@ -1,155 +0,0 @@ -package http - -HTTP_Header :: enum { - Content_Length; - Content_Type; - Expect; - TransferEncoding; - Server; - Accept; - AcceptEncoding; - Location; -} - -header_from_str :: (s: str) -> (HTTP_Header, success: bool) { - switch s |> string.strip_whitespace() |> string.to_lowercase() { - case "content-length" do return .Content_Length, true; - case "content-type" do return .Content_Type, true; - case "expect" do return .Expect, true; - case "transfer-encoding" do return .TransferEncoding, true; - case "accept" do return .Accept, true; - case "accept-encoding" do return .AcceptEncoding, true; - case "location" do return .Location, true; - case #default do return ~~ -1, false; - } -} - -#match string.as_str (v: HTTP_Header) -> str { - switch v { - case .Content_Length do return "Content-Length"; - case .Content_Type do return "Content-Type"; - case .Expect do return "Expect"; - case .TransferEncoding do return "Transfer-Encoding"; - case .Server do return "Server"; - case .Accept do return "Accept"; - case .AcceptEncoding do return "Accept-Encoding"; - case .Location do return "Location"; - case #default do return ""; - } -} - -MediaType :: enum { - PlainText; - - ApplicationJson; - - Png; - Bmp; - Gif; - Jpeg; -} - -media_type_from_str :: (s: str) -> (MediaType, success: bool) { - switch s |> string.strip_whitespace() |> string.to_lowercase() { - case "text/plain" do return .PlainText, true; - case "application/json" do return .ApplicationJson, true; - case "image/png" do return .Png, true; - case "image/bmp" do return .Bmp, true; - case "image/gif" do return .Gif, true; - case "image/jpeg" do return .Jpeg, true; - case #default do return ~~ -1, false; - } -} - -#match string.as_str (v: MediaType) -> str { - switch v { - case .PlainText do return "text/plain"; - case .ApplicationJson do return "application/json"; - case .Png do return "image/png"; - case .Bmp do return "image/bmp"; - case .Gif do return "image/gif"; - case .Jpeg do return "image/jpeg"; - case #default do return ""; - } -} - - -HTTP_Headers :: struct { - content_length: u32; - content_type: MediaType; - expect: bool; - chunked: bool; - accept: MediaType; - location: str; - custom_entries: Map(str, str); - - parse_header_line :: (use this: ^HTTP_Headers, line_: [] u8) -> bool { - line := line_; - header, content := do { - header := string.read_until(^line, #char ":"); - string.advance(^line, 1); - string.strip_leading_whitespace(^line); - return header, line; - }; - - header_type: HTTP_Header; - if header_type', success := header_from_str(header); !success { - custom_entries[header] = string.strip_whitespace(content); - return false; - } - - switch header_type { - case .Content_Length { - content_length = ~~ conv.str_to_i64(content); - return true; - } - - case .Content_Type { - content_type', success := media_type_from_str(content); - return success; - } - - case .Accept { - accept', worked := media_type_from_str(content); - return worked; - } - - case .TransferEncoding { - switch string.strip_whitespace(content) { - case "chunked" do chunked = true; - case "identity" --- - case #default do return false; - } - - return true; - } - - case .Expect { - switch string.strip_whitespace(content) { - case "100-continue" { - expect = true; - return true; - } - } - - return false; - } - - case .AcceptEncoding { - @TODO // This needs to be limited. - return true; - } - - case .Location { - location = content |> string.strip_whitespace(); - return true; - } - - case .Server { - return true; - } - } - - return false; - } -} diff --git a/modules/http/http.onyx b/modules/http/http.onyx deleted file mode 100644 index 4d05d9ee..00000000 --- a/modules/http/http.onyx +++ /dev/null @@ -1,279 +0,0 @@ -package http - -// -// These are named so that the string version of these values -// will be valid request methods. -Method :: enum { - GET; - HEAD; - POST; - PUT; - DELETE; - CONNECT; - OPTIONS; - TRACE; - PATCH; -} - -Request :: struct { - method: Method; - headers := __zero_value(Map(str, str)); - host: str; - resource: str; - body: [] u8; - - // - // Methods - // - // Send a request to a writer - send :: request_write; - - - - // - // "Factory" that constructs a GET request - get :: (resource: str, params: [] Key_Value_Pair, headers: [] Key_Value_Pair = .[]) -> Request { - req := init(Request); - req.method = .GET; - - res: [..] u8; - string.concat(^res, resource); - if params.count > 0 { - string.concat(^res, "?"); - - for^ p: params { - string.concat(^res, p.key, "=", p.value, "&"); - } - - res.count -= 1; - } - - for headers { - req.headers[it.key] = it.value; - } - - req.resource = res; - req.body = null_str; - return req; - } - - post :: #match { - (resource: str, data: [] Key_Value_Pair, encoding := Post_Data_Encoding.Url_Encoded, headers: [] Key_Value_Pair = .[]) -> Request { - req := init(Request); - req.method = .POST; - req.resource = resource; - - for headers { - req.headers[it.key] = it.value; - } - - body: [..] u8; - switch encoding { - case .Json { - string.concat(^body, "{"); - for data { - string.concat(^body, "\"", it.key, "\":\"", it.value, "\","); - } - - body.count -= 1; - string.concat(^body, "}"); - } - - case .Url_Encoded { - for data { - key := urlencode(it.key); - value := urlencode(it.value); - defer { - string.free(key); - string.free(value); - } - - string.concat(^body, key, "=", value, "&"); - } - - body.count -= 1; - } - } - - req.body = body; - return req; - } - } -} - -request_write :: (use req: ^Request, writer: ^io.Writer) { - io.write_format(writer, "{} {} {}\r\n", method, resource, HTTP_VERSION_STRING); - io.write_format(writer, "User-Agent: {}\r\n", USER_AGENT); - io.write_format(writer, "Host: {}\r\n", host); - io.write_format(writer, "Accept-Language: en\r\n"); - - for^ headers.entries { - io.write_format(writer, "{}: {}\r\n", it.key, it.value); - } - - io.write(writer, "\r\n"); - if body.count > 0 { - io.write(writer, body); - io.write(writer, "\r\n"); - } -} - - -Response :: struct { - status: i32; - headers: HTTP_Headers; - body: [] u8; - - json :: (use this: ^Response) => { - json :: package json - return json.decode(body); - } -} - - - -Connection :: struct { - url: str; - port: u16; - socket: ^net.Socket; - r: io.Reader; - w: io.Writer; - - close :: (this: ^Connection) { - this.socket->close(); - io.reader_free(^this.r); - io.writer_free(^this.w); - } - - get :: (this: ^Connection, resource: str, params: [] Key_Value_Pair, headers: [] Key_Value_Pair = .[]) -> Response { - req := Request.get(resource, params, headers); - return send_request(this, ^req); - } -} - -Connection_Error :: enum { - None; - Protocol_Not_Supported; - Socket_Creation_Failed; - Connection_Failed; -} - -connect :: (url_: str, port: u16 = 80) -> (Connection, Connection_Error) { - url := url_; - // - // HTTPS is strictly not supported. - if string.starts_with(url, "https://") { - return __zero_value(Connection), .Protocol_Not_Supported; - } - - // - // Remove HTTP specifier if given. - if string.starts_with(url, "http://") { - url = url[7 .. url.count]; - } - - conn: Connection; - conn.url = url; - conn.port = port; - conn.socket = new(net.Socket); - - err: net.SocketError; - *conn.socket, err = net.socket_create(.Inet, .Stream); - if err != .None { - return conn, .Socket_Creation_Failed; - } - - if err := conn.socket->connect(url, port); err != .None { - return conn, .Connection_Failed; - } - - // When using the io.Reader on a net.Socket, non-blocking reads must be enabled, - // because Reader assumes that it can call stream_read in a non-blocking way. - // If no data is available to read, but the stream is still alive, stream_read should - // return io.Error.ReadPending. If this is not set, the program can hang waiting for - // data to arrive on the socket when reading. - conn.socket->setting(.NonBlocking, 1); - - conn.r = io.reader_make(conn.socket); - conn.w = io.writer_make(conn.socket); - - return conn, .None; -} - -send_request :: (connection: ^Connection, req: ^Request) -> Response { - req.host = connection.url; - req->send(^connection.w); - - res: Response; - res.status = 500; - - status_line := io.read_line(^connection.r, consume_newline=true, inplace=true); - if string.starts_with(status_line, "HTTP/1.1") - || string.starts_with(status_line, "HTTP/1.0") { - res.status = ~~ conv.str_to_i64(status_line[HTTP_VERSION_STRING.count+1 .. status_line.count]); - } - - while true { - line := io.read_line(^connection.r, consume_newline=true); - if line == "\r\n" do break; - res.headers->parse_header_line(line); - delete(^line); - } - - data: [..] u8; - if res.headers.chunked { - read_chunked_body(); - } elseif res.headers.content_length > 0 { - read_simple_body(); - } - - @HACK @HACK @HACK - connection.r.start = 0; - connection.r.end = 0; - - res.body = data; - return res; - - read_chunked_body :: macro () { - while true { - line := io.read_line(^connection.r, consume_newline=true, inplace=true); - chunk_size := cast(u32) (line |> conv.str_to_i64(base=16)); - if chunk_size == 0 do break; - - array.ensure_capacity(^data, data.count + chunk_size); - read_n_bytes(chunk_size); - - io.advance_line(^connection.r); - } - } - - read_simple_body :: macro () { - array.ensure_capacity(^data, res.headers.content_length); - read_n_bytes(res.headers.content_length); - } - - read_n_bytes :: macro (n: u32) { - to_read := n; - while to_read > 0 { - bytes_read, err := io.read_bytes(^connection.r, data.data[data.count .. data.count + to_read]); - to_read -= bytes_read; - data.count += bytes_read; - } - } -} - - -Key_Value_Pair :: struct { key, value: str; } - - -#local { - HTTP_VERSION_STRING :: "HTTP/1.1" - USER_AGENT :: "onyx/0.1.0" - - Post_Data_Encoding :: enum { - Json; - Url_Encoded; - Form_Data; - } -} - diff --git a/modules/http/module.onyx b/modules/http/module.onyx deleted file mode 100644 index 93c791db..00000000 --- a/modules/http/module.onyx +++ /dev/null @@ -1,16 +0,0 @@ -package http - -#package { - string :: package core.string - conv :: package core.conv - io :: package core.io - net :: package core.net - iter :: package core.iter - array :: package core.array - - init :: (package core.intrinsics.onyx).init - __zero_value :: (package core.intrinsics.onyx).__zero_value -} - -#load_all "./." -#load "./../json/module.onyx" diff --git a/modules/http/utils.onyx b/modules/http/utils.onyx deleted file mode 100644 index 6b8d0345..00000000 --- a/modules/http/utils.onyx +++ /dev/null @@ -1,41 +0,0 @@ -package http - -urlencode :: (s: str, allocator := context.allocator) -> str { - out := array.make(u8, s.count, allocator=allocator); - - for ch: s do switch ch { - // - // This list was taken from: - // https://developer.mozilla.org/en-US/docs/Glossary/percent-encoding - match(#char ":", "%3A"); - match(#char "/", "%2F"); - match(#char "?", "%3F"); - match(#char "#", "%23"); - match(#char "[", "%5B"); - match(#char "]", "%5D"); - match(#char "@", "%40"); - match(#char "!", "%21"); - match(#char "$", "%24"); - match(#char "&", "%26"); - match(#char "'", "%27"); - match(#char "(", "%28"); - match(#char ")", "%29"); - match(#char "*", "%2A"); - match(#char "+", "%2B"); - match(#char ",", "%2C"); - match(#char ";", "%3B"); - match(#char "=", "%3D"); - match(#char "%", "%25"); - match(#char " ", "%20"); - - case #default do out << ch; - - match :: macro (from: u8, to: str) { - // - // How's this for a one-liner - case from do for to do out << it; - } - } - - return out; -} diff --git a/modules/json/decoder.onyx b/modules/json/decoder.onyx deleted file mode 100644 index c0771f2d..00000000 --- a/modules/json/decoder.onyx +++ /dev/null @@ -1,42 +0,0 @@ -package json -use package core - -decode :: (data: str, allocator := context.allocator) -> Json { - - json: Json; - json.allocator = allocator; - json.root = null; - - root, err := parse(data, allocator); - if err.kind != .None { - switch err.kind { - case .EOF do printf("Reached EOF\n"); - case .Illegal_Character do printf("Illegal Character: {}\n", err.pos); - case .String_Unterminated do printf("Unterminated String: {}\n", err.pos); - case .Unexpected_Token do printf("Unexpected Token: {}\n", err.pos); - } - - return json; - } - - json.root = root; - return json; - - - // Old testing code - #if false { - tokenizer := Tokenizer.{ data = data }; - - err : = Error.None; - tkn: Token; - - while err == .None { - tkn, err = token_get(^tokenizer); - - buf: [10] u8; - printf("%s %s\n", conv.i64_to_str(~~tkn.kind, 10, ~~buf, 2), tkn.text); - } - - return .{ allocator, null }; - } -} diff --git a/modules/json/dummy.json b/modules/json/dummy.json deleted file mode 100644 index 4fca375a..00000000 --- a/modules/json/dummy.json +++ /dev/null @@ -1,317 +0,0 @@ -[ - { - "_id": "60ca4f9c6d42737b7bed094a", - "index": 0, - "guid": "ce782a8f-c466-44fb-8bbc-9da2153de074", - "isActive": true, - "balance": "$1,984.80", - "picture": "http://placehold.it/32x32", - "age": 30, - "eyeColor": "green", - "name": "Mcguire Hodge", - "gender": "male", - "company": "SNIPS", - "email": "mcguirehodge@snips.com", - "phone": "+1 (834) 435-2386", - "address": "426 Wilson Street, Ahwahnee, Maine, 5085", - "about": "Tempor esse irure cupidatat qui eu sint elit. Voluptate nisi officia adipisicing sunt eu enim anim excepteur sunt eiusmod id magna. Sint aliqua eu minim consectetur ullamco laboris amet. Et reprehenderit est sit aute ex nulla eiusmod in occaecat. Aliqua quis dolore tempor aute consequat laborum non amet et culpa occaecat. Deserunt non aliqua consequat adipisicing.\r\n", - "registered": "2019-11-14T05:31:14 +06:00", - "latitude": -20.052331, - "longitude": 63.936704, - "tags": [ - "laborum", - "minim", - "cupidatat", - "ad", - "adipisicing", - "exercitation", - "mollit" - ], - "friends": [ - { - "id": 0, - "name": "Foster Huff" - }, - { - "id": 1, - "name": "Katheryn Gross" - }, - { - "id": 2, - "name": "Ingrid Branch" - } - ], - "greeting": "Hello, Mcguire Hodge! You have 10 unread messages.", - "favoriteFruit": "apple" - }, - { - "_id": "60ca4f9ce40b355a63bad1d5", - "index": 1, - "guid": "fde167ba-15d4-4d8e-b3e0-0e248d25ffed", - "isActive": true, - "balance": "$1,959.39", - "picture": "http://placehold.it/32x32", - "age": 32, - "eyeColor": "green", - "name": "Sybil Tucker", - "gender": "female", - "company": "TROPOLI", - "email": "sybiltucker@tropoli.com", - "phone": "+1 (980) 550-3355", - "address": "990 Beayer Place, Dowling, Louisiana, 3955", - "about": "Voluptate commodo anim elit ea nulla in culpa qui do in voluptate proident do proident. Incididunt non occaecat sint irure ex reprehenderit voluptate nulla ea ullamco. Sit incididunt enim labore veniam ipsum amet reprehenderit consectetur elit. Irure consectetur sunt sint ex nulla amet sint ea pariatur. Ad irure non sunt ex anim. Voluptate incididunt dolor voluptate id mollit officia.\r\n", - "registered": "2016-01-19T04:17:57 +06:00", - "latitude": -86.800363, - "longitude": -75.422022, - "tags": [ - "dolore", - "est", - "non", - "reprehenderit", - "dolor", - "dolor", - "irure" - ], - "friends": [ - { - "id": 0, - "name": "Hunter Woodard" - }, - { - "id": 1, - "name": "Gwendolyn Morton" - }, - { - "id": 2, - "name": "Daphne Wiley" - } - ], - "greeting": "Hello, Sybil Tucker! You have 10 unread messages.", - "favoriteFruit": "strawberry" - }, - { - "_id": "60ca4f9c43a5646bf7f31d1b", - "index": 2, - "guid": "3214362c-faa2-4282-8861-8c6a45e3f779", - "isActive": false, - "balance": "$3,838.20", - "picture": "http://placehold.it/32x32", - "age": 36, - "eyeColor": "blue", - "name": "Zelma Fuller", - "gender": "female", - "company": "KIDGREASE", - "email": "zelmafuller@kidgrease.com", - "phone": "+1 (865) 430-2263", - "address": "864 Furman Street, Norris, Nevada, 6768", - "about": "Anim qui ex velit exercitation sint irure fugiat sint ullamco aute nisi ipsum laboris. Fugiat deserunt qui do cillum deserunt. Officia ut adipisicing reprehenderit esse ex pariatur cupidatat amet amet id excepteur fugiat minim.\r\n", - "registered": "2016-12-31T02:47:40 +06:00", - "latitude": 45.942578, - "longitude": 12.857339, - "tags": [ - "exercitation", - "non", - "officia", - "occaecat", - "sunt", - "cupidatat", - "eiusmod" - ], - "friends": [ - { - "id": 0, - "name": "Stacy Willis" - }, - { - "id": 1, - "name": "Oneil Michael" - }, - { - "id": 2, - "name": "Chasity Mcgowan" - } - ], - "greeting": "Hello, Zelma Fuller! You have 10 unread messages.", - "favoriteFruit": "apple" - }, - { - "_id": "60ca4f9cd83cfc496df01adb", - "index": 3, - "guid": "cd6e6ad9-cf3f-4d6f-afa3-40e7e2fe9956", - "isActive": true, - "balance": "$3,395.72", - "picture": "http://placehold.it/32x32", - "age": 35, - "eyeColor": "blue", - "name": "Collins Morrow", - "gender": "male", - "company": "COMVEYOR", - "email": "collinsmorrow@comveyor.com", - "phone": "+1 (924) 542-3148", - "address": "604 Leonora Court, Kenvil, Puerto Rico, 9586", - "about": "Incididunt tempor deserunt eiusmod laborum aliquip nostrud consectetur exercitation labore sunt exercitation amet id. Sunt ad officia quis eiusmod velit irure voluptate. Tempor duis occaecat ad sint ullamco adipisicing sunt do labore. Id proident amet dolor fugiat deserunt proident labore irure. Lorem est deserunt cupidatat eu aute adipisicing eu. Quis laborum do nulla irure et mollit non. Fugiat exercitation veniam ad elit consequat adipisicing.\r\n", - "registered": "2019-01-11T03:50:33 +06:00", - "latitude": -48.712358, - "longitude": 46.192179, - "tags": [ - "in", - "anim", - "culpa", - "fugiat", - "sint", - "ex", - "dolore" - ], - "friends": [ - { - "id": 0, - "name": "Melody Mcdowell" - }, - { - "id": 1, - "name": "Reilly Mullen" - }, - { - "id": 2, - "name": "Lauri Garner" - } - ], - "greeting": "Hello, Collins Morrow! You have 7 unread messages.", - "favoriteFruit": "strawberry" - }, - { - "_id": "60ca4f9ce984e1b0f55d90b5", - "index": 4, - "guid": "a666b11e-7ac1-4525-ad7a-0a2ab6046e91", - "isActive": false, - "balance": "$3,014.28", - "picture": "http://placehold.it/32x32", - "age": 28, - "eyeColor": "brown", - "name": "Valentine Klein", - "gender": "male", - "company": "TERRASYS", - "email": "valentineklein@terrasys.com", - "phone": "+1 (835) 556-3161", - "address": "942 Pulaski Street, Alfarata, Kansas, 1198", - "about": "Sint pariatur cillum aliquip ullamco et tempor qui cillum do in dolor. Consequat cillum reprehenderit adipisicing dolor Lorem. Velit fugiat non quis incididunt occaecat velit aliqua voluptate nostrud Lorem consectetur commodo et.\r\n", - "registered": "2019-02-20T04:47:41 +06:00", - "latitude": 14.080616, - "longitude": 100.694685, - "tags": [ - "nulla", - "culpa", - "anim", - "ea", - "laborum", - "eu", - "incididunt" - ], - "friends": [ - { - "id": 0, - "name": "Wilkins Mcknight" - }, - { - "id": 1, - "name": "Weiss Hunter" - }, - { - "id": 2, - "name": "Butler Mckinney" - } - ], - "greeting": "Hello, Valentine Klein! You have 8 unread messages.", - "favoriteFruit": "banana" - }, - { - "_id": "60ca4f9cc03ceef660c19748", - "index": 5, - "guid": "c06b663c-cc8a-407a-8099-64216899643c", - "isActive": false, - "balance": "$1,182.77", - "picture": "http://placehold.it/32x32", - "age": 25, - "eyeColor": "brown", - "name": "Cleo Hartman", - "gender": "female", - "company": "GAZAK", - "email": "cleohartman@gazak.com", - "phone": "+1 (817) 502-2609", - "address": "451 Clove Road, Rivereno, North Dakota, 3390", - "about": "Non dolor consectetur sit fugiat aute fugiat in esse voluptate officia sit aute. Ut et ex aliquip eu. Enim aliquip aliquip minim ex veniam sunt dolore do dolor reprehenderit pariatur tempor nulla. Sit ut voluptate aliquip pariatur anim commodo ipsum elit aute aliqua adipisicing officia incididunt. Adipisicing irure cupidatat ipsum in id fugiat ad Lorem magna magna.\r\n", - "registered": "2018-12-01T07:41:00 +06:00", - "latitude": -10.880851, - "longitude": 58.654307, - "tags": [ - "ipsum", - "do", - "mollit", - "excepteur", - "aute", - "dolore", - "reprehenderit" - ], - "friends": [ - { - "id": 0, - "name": "Amy Henry" - }, - { - "id": 1, - "name": "Cathleen Edwards" - }, - { - "id": 2, - "name": "Carey Terrell" - } - ], - "greeting": "Hello, Cleo Hartman! You have 10 unread messages.", - "favoriteFruit": "strawberry" - }, - { - "_id": "60ca4f9c30055f4208a15bc9", - "index": 6, - "guid": "86384b2a-bfc3-43f6-8c28-684236fb557b", - "isActive": true, - "balance": "$3,461.71", - "picture": "http://placehold.it/32x32", - "age": 31, - "eyeColor": "blue", - "name": "Rowena Keller", - "gender": "female", - "company": "MEDMEX", - "email": "rowenakeller@medmex.com", - "phone": "+1 (834) 439-3203", - "address": "383 Mill Lane, Hannasville, Hawaii, 1404", - "about": "Aliquip reprehenderit Lorem duis aliqua. Est exercitation incididunt quis consectetur et fugiat adipisicing nisi reprehenderit amet amet quis dolore. Mollit ullamco tempor in labore ex irure qui et est sint.\r\n", - "registered": "2014-09-04T10:21:32 +05:00", - "latitude": -81.799165, - "longitude": 33.153719, - "tags": [ - "cillum", - "cillum", - "exercitation", - "do", - "cillum", - "non", - "est" - ], - "friends": [ - { - "id": 0, - "name": "Decker Rosales" - }, - { - "id": 1, - "name": "Katharine Mccullough" - }, - { - "id": 2, - "name": "Roach Pitts" - } - ], - "greeting": "Hello, Rowena Keller! You have 3 unread messages.", - "favoriteFruit": "apple" - } -] diff --git a/modules/json/encoder.onyx b/modules/json/encoder.onyx deleted file mode 100644 index d62f281c..00000000 --- a/modules/json/encoder.onyx +++ /dev/null @@ -1,142 +0,0 @@ -package json - -use package core - -Encoding_Error :: enum { - None; - Unsupported_Type; -} - -encode_string :: (v: $T, allocator := context.allocator) -> (str, Encoding_Error) { - stream := io.dynamic_string_stream_make(256); - writer := io.writer_make(^stream); - defer io.dynamic_string_stream_free(^stream); - - err := encode(^writer, v); - if err != .None { - return "", err; - } - - s := string.alloc_copy(io.dynamic_string_stream_to_str(^stream), allocator); - return s, .None; -} - -// -// This could be changed to use the "any" type now, which would allow for any type to be -// represented as a json value. However, this eliminates the control that you get from -// this way. -// -encode :: #match { - (w: ^io.Writer, v: i32) -> Encoding_Error { - io.write_i32(w, ~~v); - return .None; - }, - - (w: ^io.Writer, v: i64) -> Encoding_Error { - io.write_i64(w, ~~v); - return .None; - }, - - (w: ^io.Writer, v: f32) -> Encoding_Error { - io.write_f32(w, ~~v); - return .None; - }, - - (w: ^io.Writer, v: f64) -> Encoding_Error { - io.write_f64(w, ~~v); - return .None; - }, - - (w: ^io.Writer, v: str) -> Encoding_Error { - io.write_escaped_str(w, v); - return .None; - }, - - (w: ^io.Writer, v: [] $T) -> Encoding_Error { - io.write_byte(w, #char "["); - - for i: v.count { - if i > 0 do io.write_byte(w, #char ","); - - err := encode(w, v[i]); - if err != .None do return err; - } - - io.write_byte(w, #char "]"); - return .None; - }, - - (w: ^io.Writer, v: [..] $T) -> Encoding_Error { - io.write_byte(w, #char "["); - - for i: v.count { - if i > 0 do io.write_byte(w, #char ","); - - err := encode(w, v[i]); - if err != .None do return err; - } - - io.write_byte(w, #char "]"); - return .None; - }, - - (w: ^io.Writer, v: Map(str, $T)) -> Encoding_Error { - io.write_byte(w, #char "{"); - - for i: v.entries.count { - if i > 0 do io.write_byte(w, #char ","); - entry := ^v.entries[i]; - - io.write_escaped_str(w, entry.key); - io.write_byte(w, #char ":"); - - err := encode(w, entry.value); - if err != .None do return err; - } - - io.write_byte(w, #char "}"); - return .None; - }, - - (w: ^io.Writer, v: ^Value) -> Encoding_Error { - switch v.type { - case .Null do io.write_str(w, "null"); - case .Bool do io.write(w, v->as_bool()); - case .Integer do io.write(w, v->as_int()); - case .Float do io.write(w, v->as_float()); - case .String do encode(w, v->as_str()); - case .Array do encode(w, v->as_array()); - - case .Object { - io.write_byte(w, #char "{"); - obj := cast(^Value_Object) v; - - for i: obj.object_.count { - if i > 0 do io.write_byte(w, #char ","); - - io.write_escaped_str(w, obj.object_[i].key); - io.write_byte(w, #char ":"); - - err := encode(w, obj.object_[i].value); - if err != .None do return err; - } - - io.write_byte(w, #char "}"); - } - - case #default { - return .Unsupported_Type; - } - } - - return .None; - }, - - // This is disabled because I would prefer to have a compile time error for an unsupported type, - // as opposed to a error to check programatically. - // - // // Inserted after any of the #match directives - // #precedence 1000 (w: ^io.Writer, v: $T) -> Encoding_Error { - // return .Unsupported_Type; - // } -} diff --git a/modules/json/example.onyx b/modules/json/example.onyx deleted file mode 100644 index cd05d0a6..00000000 --- a/modules/json/example.onyx +++ /dev/null @@ -1,58 +0,0 @@ - -#load "core/std" -#load "modules/json/module" - -use package core -json :: package json - -json_string := "{ \"test\": \"\\tHello,\\n\\\"World!\\\"\", \"array\": [1,2,3,4,5,1423], \"sub\": { \"mem\": true, \"other\": null } }"; - -main :: (args: [] cstr) { - arena := alloc.arena.make(context.allocator, 4096); - defer alloc.arena.free(^arena); - - // decoded_json := json.decode(#file_contents "./dummy.json", alloc.arena.make_allocator(^arena)); - decoded_json := json.decode(json_string, alloc.arena.make_allocator(^arena)); - defer json.free(decoded_json); - - // root := decoded_json.root; - // for v: root->as_array() { - // println(v["friends"][1]["name"]->as_str()); - // } - - #if true { - value := decoded_json.root["array"]; - for v: value->as_array() { - println(v->as_int()); - } - test_str := decoded_json.root["sub"]["mem"]->as_bool(); - println(test_str); - - decoded_json.root["test"]->as_str() |> println(); - } - - json.encode(^stdio.print_writer, decoded_json.root["sub"]); - print("\n"); - - v_arr := array.make(Vector2); - defer array.free(^v_arr); - - array.push(^v_arr, .{ 10, 20 }); - array.push(^v_arr, .{ 12.34, 45.67 }); - array.push(^v_arr, .{ 0, -10 }); - - if err := json.encode(^stdio.print_writer, v_arr); err != .None { - printf("Error formatting json %i", cast(i32) err); - } - print("\n"); -} - -Vector2 :: struct { - x, y: f32; -} - -#match json.encode (w: ^io.Writer, v: Vector2) -> json.Encoding_Error { - io.write_format(w, "{{\"x\":{},\"y\":{}}}", v.x, v.y); - - return .None; -} diff --git a/modules/json/module.onyx b/modules/json/module.onyx deleted file mode 100644 index 22c2e789..00000000 --- a/modules/json/module.onyx +++ /dev/null @@ -1,13 +0,0 @@ - -// The structure for this JSON module is largely based on the structure of Odin's -// JSON parsing module found here: https://github.com/odin-lang/Odin/blob/master/core/encoding/json/ - - -package json - -#load "./encoder" -#load "./decoder" -#load "./types" - -#load "./tokenizer" -#load "./parser" \ No newline at end of file diff --git a/modules/json/parser.onyx b/modules/json/parser.onyx deleted file mode 100644 index 7bfa9105..00000000 --- a/modules/json/parser.onyx +++ /dev/null @@ -1,326 +0,0 @@ -package json -use package core - -#package -Parser :: struct { - tokenizer : Tokenizer; - allocator : Allocator; - - current_token : Token; - previous_token : Token; -} - -#package -make_parser :: (data: [] u8, allocator := context.allocator) -> Parser { - parser: Parser; - parser.tokenizer = Tokenizer.{ data = data }; - parser.allocator = allocator; - consume_token(^parser); - return parser; -} - -#package -parse :: (data: [] u8, allocator := context.allocator) -> (^Value, Error) { - parser := make_parser(data, allocator); - return parse_value(^parser); -} - -#local -consume_token :: (use parser: ^Parser) -> (Token, Error) { - error: Error; - previous_token = current_token; - current_token, error = token_get(^tokenizer); - return previous_token, error; -} - -#local -consume_token_if_next :: (use parser: ^Parser, kind: Token.Kind) -> bool { - if current_token.kind == kind { - consume_token(parser); - return true; - } - - return false; -} - -#local -expect_token :: (use parser: ^Parser, kind: Token.Kind) -> (Token, Error) { - previous := current_token; - consume_token(parser); - error := Error.{ .None, previous.position }; - if previous.kind != kind do error.kind = .Unexpected_Token; - return previous, error; -} - -#package -parse_value :: (use parser: ^Parser) -> (^Value, Error) { - return_value: ^Value = null; - - current := current_token; - switch current.kind { - case .Null { - value := new(Value, allocator); - - consume_token(parser); - return_value = value; - } - - case .False, .True { - value := new(Value_Bool, allocator); - value.bool_ = current.kind == .True; - - consume_token(parser); - return_value = value; - } - - case .Integer { - value := new(Value_Integer, allocator); - value.int_ = conv.str_to_i64(current.text); - - consume_token(parser); - return_value = value; - } - - case .Float { - value := new(Value_Float, allocator); - value.float_ = conv.str_to_f64(current.text); - - consume_token(parser); - return_value = value; - } - - case .String { - value := new(Value_String, allocator); - value.str_ = unescape_string(current, allocator); - - consume_token(parser); - return_value = value; - } - - case .Open_Bracket { - value, err := parse_array(parser); - if err.kind != .None do return value, err; - - return_value = value; - } - - case .Open_Brace { - value, err := parse_object(parser); - if err.kind != .None do return value, err; - - return_value = value; - } - - case #default { - consume_token(parser); - return return_value, .{ .Unexpected_Token, current.position }; - } - } - - return return_value, .{ .None }; -} - -#local -parse_array :: (use parser: ^Parser) -> (^Value_Array, Error) { - value := new(Value_Array, allocator); - - _, err := expect_token(parser, .Open_Bracket); - if err.kind != .None do return value, err; - - // This uses the context allocators because the array resizing needs to happen in a general purpose heap allocator - arr := array.make(#type ^Value, allocator=context.allocator); - defer if err.kind != .None { - for elem: arr { - free(elem, allocator); - } - - array.free(^arr); - } - - while current_token.kind != .Close_Bracket { - elem, elem_err := parse_value(parser); - if elem_err.kind != .None { - err = elem_err; - return value, err; - } - - array.push(^arr, elem); - - if !consume_token_if_next(parser, .Comma) { - break; - } - } - - _, close_err := expect_token(parser, .Close_Bracket); - if close_err.kind != .None { - err = close_err; - return value, err; - } - - value.array_ = arr; - return value, err; -} - - -#local -parse_object :: (use parser: ^Parser) -> (^Value_Object, Error) { - value := new(Value_Object, allocator); - - _, err := expect_token(parser, .Open_Brace); - if err.kind != .None do return value, err; - - // This uses the context allocators because the array resizing needs to happen in a general purpose heap allocator - array.init(^value.object_, allocator=context.allocator); - defer if err.kind != .None { - free(value, allocator); - } - - while current_token.kind != .Close_Brace { - key_token, key_err := expect_token(parser, .String); - if key_err.kind != .None { - err = key_err; - return value, err; - } - - key := unescape_string(key_token, allocator); - - _, colon_err := expect_token(parser, .Colon); - if colon_err.kind != .None { - err = colon_err; - return value, err; - } - - elem, elem_err := parse_value(parser); - if elem_err.kind != .None { - err = elem_err; - return value, err; - } - - // Checking for duplicate keys. I have it disabled for the moment. - #if false { - for elem: value.object_ { - if elem.key == key { - err.kind = .Duplicate_Keys; - err.pos = key_token.pos; - string.free(key, allocator); - return value, err; - } - } - } - - array.push(^value.object_, .{ - key = key, - value = elem - }); - - if !consume_token_if_next(parser, .Comma) { - break; - } - } - - _, close_err := expect_token(parser, .Close_Brace); - if close_err.kind != .None { - err = close_err; - return value, err; - } - - return value, err; -} - - -#local -unescape_string :: (token: Token, allocator: Allocator) -> str { - if token.kind != .String do return ""; - - s := token.text; - if s.count <= 2 do return ""; - - s = s.data[1 .. s.count - 1]; - - i := 0; - for c: s { - if c == #char "\\" || c == #char "\"" || c < #char " " { - break; - } - - i += 1; - } - - if i == s.count { - return string.alloc_copy(s, allocator); - } - - buffer := memory.make_slice(u8, s.count, allocator=allocator); - string.copy(s.data[0 .. i], buffer); - buffer_write := i; - - while i < s.count { - c := s[i]; - - switch c { - case #char "\\" { - i += 1; - if i >= s.count do break break; - - switch s[i] { - case #char "\"", #char "'", #char "\\", #char "/" { - buffer[buffer_write] = s[i]; - i += 1; - buffer_write += 1; - } - - case #char "n" { - buffer[buffer_write] = #char "\n"; - i += 1; - buffer_write += 1; - } - - case #char "t" { - buffer[buffer_write] = #char "\t"; - i += 1; - buffer_write += 1; - } - - case #char "r" { - buffer[buffer_write] = #char "\r"; - i += 1; - buffer_write += 1; - } - - case #char "b" { - buffer[buffer_write] = #char "\b"; - i += 1; - buffer_write += 1; - } - - case #char "f" { - buffer[buffer_write] = #char "\f"; - i += 1; - buffer_write += 1; - } - - case #char "v" { - buffer[buffer_write] = #char "\v"; - i += 1; - buffer_write += 1; - } - - case #char "0" { - buffer[buffer_write] = #char "\0"; - i += 1; - buffer_write += 1; - } - } - } - - case #default { - buffer[buffer_write] = c; - i += 1; - buffer_write += 1; - } - } - } - - buffer.count = buffer_write; - return buffer; -} diff --git a/modules/json/tokenizer.onyx b/modules/json/tokenizer.onyx deleted file mode 100644 index 32a7ed61..00000000 --- a/modules/json/tokenizer.onyx +++ /dev/null @@ -1,221 +0,0 @@ -// Everything in this file is marked #package because I do not think -// that this code will be needed outside of this module. I do not see -// the value of having access to the tokenizer and parser of JSON directly. - - -package json -use package core - -#package -Tokenizer :: struct { - data: [] u8; - use position := Position.{ 0, 1, 1 }; -} - -#package -Token :: struct { - Kind :: enum { - Invalid; - - Open_Brace; // { - Close_Brace; // } - - Open_Bracket; // [ - Close_Bracket; // ] - - Comma; - Colon; - - Null; - True; - False; - - Integer; - Float; - String; - } - - kind: Kind = .Invalid; - text: str = null_str; - use position := Position.{ 0, 1, 1 }; -} - -#package -Position :: struct { - offset : u32; // Offset into the stream - line, column : u32; // Line and column number -} - -#package -token_get :: (use tkn: ^Tokenizer) -> (Token, Error) { - err := Error.{}; - - skip_whitespace(tkn); - token := Token.{}; - token.position = tkn.position; - - curr_char := data[offset]; - next_char, has_next := next_character(tkn); - if !has_next do return .{}, .{ .EOF, token.position }; - - switch curr_char { - case #char "{" do token.kind = .Open_Brace; - case #char "}" do token.kind = .Close_Brace; - case #char "[" do token.kind = .Open_Bracket; - case #char "]" do token.kind = .Close_Bracket; - case #char "," do token.kind = .Comma; - case #char ":" do token.kind = .Colon; - - case #char "a" .. #char "z" { - token.kind = .Invalid; - skip_alpha_numeric(tkn); - - identifier := data.data[token.offset .. offset]; - if identifier == "null" do token.kind = .Null; - if identifier == "true" do token.kind = .True; - if identifier == "false" do token.kind = .False; - } - - case #char "-" { - switch data[offset] { - case #char "0" .. #char "9" --- - case #default { - err.kind = .Illegal_Character; - err.pos = token.position; - break break; - } - } - - fallthrough; - } - - case #char "0" .. #char "9" { - token.kind = .Integer; - skip_numeric(tkn); - - if data[offset] == #char "." { - token.kind = .Float; - next_character(tkn); - skip_numeric(tkn); - } - - if data[offset] == #char "e" || data[offset] == #char "E" { - next_character(tkn); - if data[offset] == #char "-" || data[offset] == #char "+" { - next_character(tkn); - } - skip_numeric(tkn); - } - } - - case #char "\"" { - token.kind = .String; - - while offset < data.count { - ch := data[offset]; - if ch == #char "\n" { - err.kind = .String_Unterminated; - err.pos = token.position; - break break; - } - - next_character(tkn); - if ch == #char "\"" { - break; - } - - if ch == #char "\\" { - skip_escape(tkn); - } - } - } - } - - token.text = data.data[token.offset .. offset]; - - if token.kind == .Invalid do err.kind = .Illegal_Character; - - return token, err; -} - -#local -next_character :: (use tkn: ^Tokenizer) -> (u8, bool) { - if offset >= data.count do return 0, false; - - retval := data[offset]; - offset += 1; - column += 1; - - return retval, true; -} - -#local -skip_whitespace :: (use tkn: ^Tokenizer) { - while offset < data.count { - switch data[offset] { - case #char "\t", #char " ", #char "\r", #char "\v" { - next_character(tkn); - } - - case #char "\n" { - line += 1; - column = 1; - offset += 1; - } - - case #default { - break break; - } - } - } -} - -#local -skip_alpha_numeric :: (use tkn: ^Tokenizer) { - while offset < data.count { - switch data[offset] { - case #char "A" .. #char "Z", #char "a" .. #char "z", #char "0" .. #char "9", #char "_" { - next_character(tkn); - continue; - } - } - - break; - } -} - -#local -skip_numeric :: (use tkn: ^Tokenizer) { - while offset < data.count { - switch data[offset] { - case #char "0" .. #char "9" { - next_character(tkn); - continue; - } - } - - break; - } -} - -#local -skip_escape :: (use tkn: ^Tokenizer) { - switch data[offset] { - case #char "u" { - for i: 4 { - ch, _ := next_character(tkn); - switch ch { - case #char "0" .. #char "9", - #char "A" .. #char "F", - #char "a" .. #char "f" --- - - case #default do return; - } - } - } - - case #default { - next_character(tkn); - } - } -} diff --git a/modules/json/types.onyx b/modules/json/types.onyx deleted file mode 100644 index 49bc0242..00000000 --- a/modules/json/types.onyx +++ /dev/null @@ -1,203 +0,0 @@ -package json -use package core - -null_value := Value.{} - -Json :: struct { - // This is the allocator for all of the values in the JSON tree. - // It is not the allocator the arrays and objects however. Those - // have their own allocator, which I'm assuming will always be - // the general purpose heap allocator. - allocator: Allocator; - - root: ^Value; -} - -Error :: struct { - Kind :: enum { - None; - EOF; - Illegal_Character; - String_Unterminated; - Unexpected_Token; - } - - kind := Kind.None; - use pos := Position.{ 0, 1, 1 }; -} - - -Value :: struct { - Type :: enum { - Null :: 0x00; - Bool; - Integer; - Float; - String; - Array; - Object; - } - - type := Type.Null; - - as_bool :: (v: ^Value) -> bool { - if v == null do return false; - - if v.type == .Bool do return (cast(^Value_Bool) v).bool_; - return false; - } - - as_str :: (v: ^Value) -> str { - if v == null do return null_str; - - if v.type == .String do return (cast(^Value_String) v).str_; - return ""; - } - - as_int :: (v: ^Value) -> i64 { - if v == null do return 0; - - if v.type == .Integer do return (cast(^Value_Integer) v).int_; - return 0; - } - - as_float :: (v: ^Value) -> f64 { - if v == null do return 0; - - if v.type == .Float do return (cast(^Value_Float) v).float_; - return 0; - } - - as_array :: (v: ^Value) -> [..] ^Value { - if v == null do return .{ null, 0, 0, .{ null, null_proc } }; - if v.type != .Array do return .{ null, 0, 0, .{ null, null_proc } }; - - return (cast(^Value_Array) v).array_; - } - - is_null :: (v: ^Value) -> bool { - if v == null do return true; - return v == ^null_value || v.type == .Null; - } -} - -Value_Bool :: struct { - use base := Value.{ type = .Bool }; - bool_: bool; -} - -Value_Integer :: struct { - use base := Value.{ type = .Integer }; - int_: i64; -} - -Value_Float :: struct { - use base := Value.{ type = .Float }; - float_: f64; -} - -Value_String :: struct { - use base := Value.{ type = .String }; - str_: str; - - // Set if the string should not be freed from the allocator. - static := false; -} - -Value_Array :: struct { - use base := Value.{ type = .Array }; - array_: [..] ^Value; -} - -Value_Object :: struct { - use base := Value.{ type = .Object }; - object_: [..] struct { - key : str; - key_is_static := false; - - value : ^Value; - }; -} - -#operator [] get -get :: (v: ^Value, key: str) -> ^Value { - if v.type != .Object do return ^null_value; - - for ^entry: (cast(^Value_Object) v).object_ { - if entry.key == key do return entry.value; - } - return ^null_value; -} - -// This is an interesting operator overload, as it completely disables the -// ability to do array lookups on an array of values. So you cannot have an -// [..] Value, because the implementation of dynamic arrays heavily relies -// on the ability to do arr.data[...]. This isn't a problem for this program, -// but this is why I waited on adding overloading to '[]'. -#operator [] get_idx -get_idx :: (v: ^Value, idx: i32) -> ^Value { - if v.type != .Array do return ^null_value; - - v_arr := cast(^Value_Array) v; - if idx < 0 || idx >= v_arr.array_.count do return ^null_value; - - return v_arr.array_[idx]; -} - -set :: #match { - macro (v: ^Value, key: str, value: ^Value, key_is_static := false) { - if v.type == .Object { - Value_Object_ :: Value_Object ; - - (cast(^Value_Object_) v).object_ << .{ key, key_is_static, value }; - } - }, - - // Quick thing for allocating json values on the stack. - macro (v: ^Value, key: str, value: str, key_is_static := false, value_is_static := false) { - Value_String_ :: Value_String ; - Value_Object_ :: Value_Object ; - - if v.type == .Object { - json_value := init(Value_String_); - json_value.str_ = value; - json_value.static = value_is_static; - - (cast(^Value_Object_) v).object_ << .{ key, key_is_static, ^json_value }; - } - } -} - -free :: #match { - (v: ^Value, allocator: Allocator) do switch v.type { - case .String { - v_str := cast(^Value_String) v; - if !v_str.static do raw_free(allocator, v_str.str_.data); - } - - case .Array { - v_arr := cast(^Value_Array) v; - for elem: v_arr.array_ { - free(elem, allocator); - } - array.free(^v_arr.array_); - } - - case .Object { - v_obj := cast(^Value_Object) v; - for ^entry: v_obj.object_ { - if !entry.key_is_static do raw_free(allocator, entry.key.data); - free(entry.value, allocator); - } - array.free(^v_obj.object_); - } - }, - - (use j: Json) { - free(root, allocator); - }, -} - -static_string :: (s: str) -> Value_String { - return .{ str_ = s, static = true }; -} diff --git a/modules/ncurses/build.onyx b/modules/ncurses/build.onyx deleted file mode 100644 index 66c540ea..00000000 --- a/modules/ncurses/build.onyx +++ /dev/null @@ -1,52 +0,0 @@ -#load "core/std" -#load "scripts/c_binding" -#load "scripts/c_library" -#load "./module" - -use package core -use package c_binding - -main :: () { - path := module_path(#file); - - c_file_path := string.concat(path, "ncurses.c"); - - result := build_c_binding(.{ - output_file = c_file_path, - foreign_block = (package ncurses).foreign_block, - - cast_map = .[ - .{ (package ncurses).WINDOW, "WINDOW *" }, - ], - - preamble = .[ -""" -#include "ncurses.h" - -#define __get_stdscr() ((unsigned long int) stdscr) - -void __get_yx (WINDOW *w, int *y, int *x) { getyx(w, *y, *x); } -void __get_par_yx(WINDOW *w, int *y, int *x) { getparyx(w, *y, *x); } -void __get_beg_yx(WINDOW *w, int *y, int *x) { getbegyx(w, *y, *x); } -void __get_max_yx(WINDOW *w, int *y, int *x) { getmaxyx(w, *y, *x); } -""" - ], - - custom_implementations = .[], - }); - - if !result { - println("Failed to make c-file."); - os.exit(1); - } else { - println("Sucessfully made ncurses.c"); - } - - result = compile_c_file(c_file_path, string.concat(path, "onyx_ncurses.so"), libraries=.["ncurses"]); - if !result { - println("Failed to compile ncurses.c"); - os.exit(1); - } else { - println("Sucessfully made onyx_ncurses.so"); - } -} \ No newline at end of file diff --git a/modules/ncurses/module.onyx b/modules/ncurses/module.onyx deleted file mode 100644 index 2ce78887..00000000 --- a/modules/ncurses/module.onyx +++ /dev/null @@ -1,595 +0,0 @@ -package ncurses - -use package core {cptr, conv, string} - -#local Building_Library :: #defined ((package runtime).Generated_Foreign_Info) - -#if Building_Library { - // "Forward" the foreign block info to the public scope - // if foreign block information was generated. - foreign_block :: __foreign_block -} else { - // Otherwise, require the library to be included. - #library "onyx_ncurses" -} - -#local __foreign_block :: #foreign "onyx_ncurses" { - // initscr - initscr :: () -> WINDOW --- - endwin :: () -> i32 --- - isendwin :: () -> bool --- - newterm :: (type: cstr, out_fd, in_fd: ^u32) -> SCREEN --- - set_term :: (new: SCREEN) -> SCREEN --- - delscreen :: (sp: SCREEN) -> void --- - exit_curses :: (code: i32) -> void --- - - // color - start_color :: () -> i32 --- - has_colors :: () -> bool --- - can_change_color :: () -> bool --- - init_pair :: (pair: i32, foreground: i32, background: i32) -> i32 --- - init_color :: (color: i32, r, g, b: i32) -> i32 --- - color_content :: (color: i32, r, g, b: ^i32) -> i32 --- - pair_content :: (pair: i32, f, b: ^i32) -> i32 --- - reset_color_pairs :: () -> void --- - COLOR_PAIR :: (color: i32) -> i32 --- - PAIR_NUMBER :: (pair: i32) -> i32 --- - - // inopts - cbreak :: () -> i32 --- - nocbreak :: () -> i32 --- - echo :: () -> i32 --- - noecho :: () -> i32 --- - intrflush :: (w: WINDOW, bf: bool) -> i32 --- - keypad :: (w: WINDOW, bf: bool) -> i32 --- - meta :: (w: WINDOW, bf: bool) -> i32 --- - nodelay :: (w: WINDOW, bf: bool) -> i32 --- - notimeout :: (w: WINDOW, bf: bool) -> i32 --- - nl :: () -> i32 --- - nonl :: () -> i32 --- - raw :: () -> i32 --- - noraw :: () -> i32 --- - qiflush :: () -> void --- - noqiflush :: () -> void --- - halfdelay :: (tenths: i32) -> i32 --- - timeout :: (delay: i32) -> void --- - wtimeout :: (w: WINDOW, delay: i32) -> void --- - typeahead :: (fd: i32) -> i32 --- - - // outopts - clearkok :: (w: WINDOW, bf: bool) -> i32 --- - idlok :: (w: WINDOW, bf: bool) -> i32 --- - idcok :: (w: WINDOW, bf: bool) -> void --- - immedok :: (w: WINDOW, bf: bool) -> void --- - leaveok :: (w: WINDOW, bf: bool) -> i32 --- - scrollok :: (w: WINDOW, bf: bool) -> i32 --- - setscrreg :: (top, bot: i32) -> i32 --- - wsetscrreg :: (w: WINDOW, top, bot: i32) -> i32 --- - - // attr - attr_get :: (attr: ^attr_t, pair: ^u16, opts: ^void) -> i32 --- - wattr_get :: (w: WINDOW, attr: ^attr_t, pair: ^u16, opts: ^void) -> i32 --- - attr_set :: (attr: ^attr_t, pair: u16, opts: ^void) -> i32 --- - wattr_set :: (w: WINDOW, attr: attr_t, pair: u16, opts: ^void) -> i32 --- - attr_off :: (attr: attr_t, opts: ^void) -> i32 --- - wattr_off :: (w: WINDOW, attr: attr_t, opts: ^void) -> i32 --- - attr_on :: (attr: attr_t, opts: ^void) -> i32 --- - wattr_on :: (w: WINDOW, attr: attr_t, opts: ^void) -> i32 --- - attroff :: (attr: attr_t) -> i32 --- - wattroff :: (w: WINDOW, attr: attr_t) -> i32 --- - attron :: (attr: attr_t) -> i32 --- - wattron :: (w: WINDOW, attr: attr_t) -> i32 --- - attrset :: (attr: attr_t) -> i32 --- - wattrset :: (w: WINDOW, attr: attr_t) -> i32 --- - chgat :: (n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 --- - wchgat :: (w: WINDOW, n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 --- - mvchgat :: (y, x: i32, n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 --- - mvmchgat :: (w: WINDOW, y, x: i32, n: i32, attr: attr_t, pair: u16, opts: ^void) -> i32 --- - color_set :: (pair: u16, opts: ^void) -> i32 --- - wcolor_set :: (w: WINDOW, pair: u16, opts: ^void) -> i32 --- - standend :: () -> i32 --- - wstandend :: (w: WINDOW) -> i32 --- - standout :: () -> i32 --- - wstandout :: (w: WINDOW) -> i32 --- - - // util - unctrl :: (c: chtype) -> cptr(u8) --- - // wunctrl :: (c: ^u8) -> cptr(u8) --- - keyname :: (c: i32) -> cptr(u8) --- - key_name :: (w: i32) -> cptr(u8) --- - filter :: () -> void --- - nofilter :: () -> void --- - use_env :: (f: bool) -> void --- - use_tioctl :: (f: bool) -> void --- - // putwin :: (w: WINDOW, filep: u32) -> i32 --- - getwin :: (filep: u32) -> WINDOW --- - delay_output :: (ms: i32) -> i32 --- - flushinp :: () -> i32 --- - - // kernel - def_prog_mode :: () -> i32 --- - def_shell_mode :: () -> i32 --- - reset_prog_mode :: () -> i32 --- - reset_shell_mode :: () -> i32 --- - resetty :: () -> i32 --- - savetty :: () -> i32 --- - getsyx :: (y, x: i32) -> void --- - setsyx :: (y, x: i32) -> void --- - // ripoffline :: (line: i32, init: (WINDOW, i32) -> i32) -> i32 --- - curs_set :: (visibility: i32) -> i32 --- - napms :: (ms: i32) -> i32 --- - - // refresh - refresh :: () -> i32 --- - wrefresh :: (w: WINDOW) -> i32 --- - wnoutrefresh :: (w: WINDOW) -> i32 --- - doupdate :: () -> i32 --- - redrawwin :: (w: WINDOW) -> i32 --- - wredrawln :: (w: WINDOW, beg_line, num_lines: i32) -> i32 --- - - // addch - addch :: (ch: chtype) -> i32 --- - waddch :: (w: WINDOW, ch: chtype) -> i32 --- - mvaddch :: (y, x: i32, ch: chtype) -> i32 --- - mvwaddch :: (w: WINDOW, y, x: i32, ch: chtype) -> i32 --- - echochar :: (ch: chtype) -> i32 --- - wechochar :: (w: WINDOW, ch: chtype) -> i32 --- - - // addchstr - addchstr :: (chstr: ^chtype) -> i32 --- - addchnstr :: (chstr: [] chtype) -> i32 --- - waddchstr :: (w: WINDOW, chstr: ^chtype) -> i32 --- - waddchnstr :: (w: WINDOW, chstr: [] chtype) -> i32 --- - mvaddchstr :: (y, x: i32, chstr: ^chtype) -> i32 --- - mvaddchnstr :: (y, x: i32, chstr: [] chtype) -> i32 --- - mvwaddchstr :: (w: WINDOW, y, x: i32, chstr: ^chtype) -> i32 --- - mvwaddchnstr :: (w: WINDOW, y, x: i32, chstr: [] chtype) -> i32 --- - - // addstr - addstr :: (chstr: cstr) -> i32 --- - addnstr :: (chstr: str) -> i32 --- - waddstr :: (w: WINDOW, chstr: cstr) -> i32 --- - waddnstr :: (w: WINDOW, chstr: str) -> i32 --- - mvaddstr :: (y, x: i32, chstr: cstr) -> i32 --- - mvaddnstr :: (y, x: i32, chstr: str) -> i32 --- - mvwaddstr :: (w: WINDOW, y, x: i32, chstr: cstr) -> i32 --- - mvwaddnstr :: (w: WINDOW, y, x: i32, chstr: str) -> i32 --- - - // clear - erase :: () -> i32 --- - werase :: (w: WINDOW) -> i32 --- - clear :: () -> i32 --- - wclear :: (w: WINDOW) -> i32 --- - clrtobot :: () -> i32 --- - wclrtobot :: (w: WINDOW) -> i32 --- - clrtoeol :: () -> i32 --- - wclrtoeol :: (w: WINDOW) -> i32 --- - - // opaque - is_cleared :: (w: WINDOW) -> bool --- - is_idcok :: (w: WINDOW) -> bool --- - is_idlok :: (w: WINDOW) -> bool --- - is_immedok :: (w: WINDOW) -> bool --- - is_keypad :: (w: WINDOW) -> bool --- - is_leaveok :: (w: WINDOW) -> bool --- - is_nodelay :: (w: WINDOW) -> bool --- - is_notimeout :: (w: WINDOW) -> bool --- - is_pad :: (w: WINDOW) -> bool --- - is_scrollok :: (w: WINDOW) -> bool --- - is_subwin :: (w: WINDOW) -> bool --- - is_syncok :: (w: WINDOW) -> bool --- - wgetparent :: (w: WINDOW) -> WINDOW --- - wgetdelay :: (w: WINDOW) -> i32 --- - @TODO // Why doesn't this one work? - // wgetscrreg :: (w: WINDOW, top, bottom: ^i32) -> void --- - - // window - newwin :: (nlines, ncols, y, x: i32) -> WINDOW --- - delwin :: (w: WINDOW) -> i32 --- - mvwin :: (w: WINDOW, y, x: i32) -> i32 --- - subwin :: (w: WINDOW, nlines, ncols, y, x: i32) -> WINDOW --- - derwin :: (w: WINDOW, nlines, ncols, y, x: i32) -> WINDOW --- - mvderwin :: (w: WINDOW, parent_y, parent_x: i32) -> i32 --- - dupwin :: (w: WINDOW) -> WINDOW --- - wsyncup :: (w: WINDOW) -> void --- - syncok :: (w: WINDOW, bf: bool) -> i32 --- - wcursyncup :: (w: WINDOW) -> void --- - wsyncdown :: (w: WINDOW) -> void --- - - // touch - touchline :: (w: WINDOW, start, count: i32) -> i32 --- - touchwin :: (w: WINDOW) -> i32 --- - wtouchln :: (w: WINDOW, y, b, changed: i32) -> i32 --- - untouchwin :: (w: WINDOW) -> i32 --- - is_linetouched :: (w: WINDOW, line: i32) -> bool --- - is_wintouched :: (w: WINDOW) -> bool --- - - // bkgd - bkgdset :: (ch: chtype) -> void --- - wbkgdset :: (w: WINDOW, ch: chtype) -> void --- - bkgd :: (bh: chtype) -> i32 --- - wbkgd :: (w: WINDOW, ch: chtype) -> i32 --- - getbkgd :: (w: WINDOW) -> chtype --- - - // inch - inch :: () -> chtype --- - winch :: (w: WINDOW) -> chtype --- - mvinch :: (y, x: i32) -> chtype --- - mvwinch :: (w: WINDOW, y, x: i32) -> chtype --- - - // getch - getch :: () -> i32 --- - wgetch :: (w: WINDOW) -> i32 --- - mvgetch :: (y, x: i32) -> i32 --- - mvwgetch :: (y, x: i32, w: WINDOW) -> i32 --- - ungetch :: (ch: i32) -> i32 --- - has_key :: (ch: i32) -> i32 --- - - // getyx - __get_yx :: (w: WINDOW, y, x: ^i32) -> void --- - __get_par_yx :: (w: WINDOW, y, x: ^i32) -> void --- - __get_beg_yx :: (w: WINDOW, y, x: ^i32) -> void --- - __get_max_yx :: (w: WINDOW, y, x: ^i32) -> void --- - - // getstr - // The API for these is horrible for use in Onyx. - // Use ogetstr and family for a better API. - getstr :: (s: cstr) -> i32 --- // Wildly unsafe! - getnstr :: (s: str) -> i32 --- - wgetstr :: (w: WINDOW, s: cstr) -> i32 --- - wgetnstr :: (w: WINDOW, s: str) -> i32 --- - mvgetstr :: (y, x: i32, s: cstr) -> i32 --- // Wildly unsafe! - mvgetnstr :: (y, x: i32, s: str) -> i32 --- - mvwgetstr :: (w: WINDOW, y, x: i32, s: cstr) -> i32 --- - mvwgetnstr :: (w: WINDOW, y, x: i32, s: str) -> i32 --- - - // border - border :: (ls, rs, ts, bs, tl, tr, bl, br: chtype) -> i32 --- - wborder :: (w: WINDOW, ls, rs, ts, bs, tl, tr, bl, br: chtype) -> i32 --- - box :: (w: WINDOW, verch, horch: chtype) -> i32 --- - hline :: (ch: chtype, n: i32) -> i32 --- - whline :: (w: WINDOW, ch: chtype, n: i32) -> i32 --- - vline :: (ch: chtype, n: i32) -> i32 --- - wvline :: (w: WINDOW, ch: chtype, n: i32) -> i32 --- - mvhline :: (y, x: i32, ch: chtype, n: i32) -> i32 --- - mvwhline :: (w: WINDOW, y, x: i32, ch: chtype, n: i32) -> i32 --- - mvvline :: (y, x: i32, ch: chtype, n: i32) -> i32 --- - mvwvline :: (w: WINDOW, y, x: i32, ch: chtype, n: i32) -> i32 --- - - // new_pair - allow_pair :: (fg, bg: i32) -> i32 --- - find_pair :: (fg, bg: i32) -> i32 --- - free_pair :: (pair: i32) -> i32 --- - - // default_colors - use_default_colors :: () -> i32 --- - assume_default_colors :: (fg, bg: i32) -> i32 --- - - // termattrs - buadrate :: () -> i32 --- - erasechar :: () -> u8 --- - has_ic :: () -> bool --- - has_il :: () -> bool --- - killchar :: () -> u8 --- - longname :: () -> cptr(u8) --- - term_attrs :: () -> attr_t --- - termattrs :: () -> chtype --- - termname :: () -> void --- - - // beep - beep :: () -> void --- - flash :: () -> void --- - - // overlay - overlay :: (srcwin: WINDOW, dstwin: WINDOW) -> i32 --- - overwrite :: (srcwin: WINDOW, dstwin: WINDOW) -> i32 --- - copywin :: (srcwin: WINDOW, dstwin: WINDOW, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, overlay: i32) -> i32 --- - - // pad - newpad :: (nlines, ncols: i32) -> WINDOW --- - subpad :: (orig: WINDOW, nlines, ncols: i32, begin_y, begin_x: i32) -> WINDOW --- - prefresh :: (pad: WINDOW, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol: i32) -> i32 --- - pnoutrefresh :: (pad: WINDOW, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol: i32) -> i32 --- - pechochar :: (pad: WINDOW, ch: chtype) -> i32 --- - - // define_key - define_key :: (definition: cstr, keycode: i32) -> i32 --- - keyok :: (keycode: i32, enable: bool) -> i32 --- - key_defined :: (definition: cstr) -> i32 --- - - // delch - delch :: () -> i32 --- - wdelch :: (w: WINDOW) -> i32 --- - mvdelch :: (y, x: i32) -> i32 --- - mvwdelch :: (w: WINDOW, y, x: i32) -> i32 --- - - // deleteln - deleteln :: () -> i32 --- - wdeleteln :: (w: WINDOW) -> i32 --- - insdelln :: (n: i32) -> i32 --- - winsdelln :: (w: WINDOW, n: i32) -> i32 --- - insertln :: () -> i32 --- - winsertln :: (w: WINDOW) -> i32 --- - - // slk - slk_init :: (fmt: i32) -> i32 --- - slk_set :: (labnum: i32, label: cstr, fmt: i32) -> i32 --- - slk_label :: (labnum: i32) -> cptr(u8) --- - slk_refresh :: () -> i32 --- - slk_noutrefresh :: () -> i32 --- - slk_clear :: () -> i32 --- - slk_restore :: () -> i32 --- - slk_touch :: () -> i32 --- - slk_attron :: (attrs: chtype) -> i32 --- - slk_attroff :: (attrs: chtype) -> i32 --- - slk_attrset :: (attrs: chtype) -> i32 --- - slk_attr :: () -> attr_t --- - slk_color :: (pair: i32) -> i32 --- - - // legacy - getattrs :: (w: WINDOW) -> i32 --- - getbegx :: (w: WINDOW) -> i32 --- - getbegy :: (w: WINDOW) -> i32 --- - getcurx :: (w: WINDOW) -> i32 --- - getcury :: (w: WINDOW) -> i32 --- - getmaxx :: (w: WINDOW) -> i32 --- - getmaxy :: (w: WINDOW) -> i32 --- - getparx :: (w: WINDOW) -> i32 --- - getpary :: (w: WINDOW) -> i32 --- - - // mouse - has_mouse :: () -> bool --- - getmouse :: (@out event: ^MEvent) -> i32 --- - ungetmouse :: (@out event: ^MEvent) -> i32 --- - mousemask :: (newmask: mmask_t, @out oldmask: ^mmask_t) -> mmask_t --- - wenclose :: (w: WINDOW, y, x: i32) -> bool --- - mouse_trafo :: (py, px: ^i32, to_screen: bool) -> bool --- - wmouse_trafo :: (w: WINDOW, py, px: ^i32, to_screen: bool) -> bool --- - mouseinterval :: (erval: i32) -> i32 --- - - // resizeterm - is_term_resized :: (lines, columns: i32) -> bool --- - resize_term :: (lines, columns: i32) -> bool --- - resizeterm :: (lines, columns: i32) -> bool --- - - // scroll - scroll :: (w: WINDOW) -> i32 --- - scrl :: (n: i32) -> i32 --- - wscrl :: (w: WINDOW, n: i32) -> i32 --- - - // variables - __get_stdscr :: () -> WINDOW --- - NCURSES_ACS :: (a: i32) -> chtype --- -} - -// Types have to always be included -WINDOW :: #distinct u64 -SCREEN :: #distinct u64 -chtype :: u32 -attr_t :: u32 - -mmask_t :: u64 -MEvent :: struct { - id: u16; - x, y, z: i32; - bstate: mmask_t; -} - - -#if !Building_Library { - -stdscr :: __get_stdscr -getyx :: __get_yx -getparyx :: __get_par_yx -getbegyx :: __get_beg_yx -getmaxyx :: __get_max_yx - -ogetstr :: ($max_length: i32 = 1024) => { - buf: [max_length] u8; - err := getnstr(buf); - return string.alloc_copy(string.from_cstr(~~ buf)); -} - -mvogetstr :: (y, x: i32, $max_length: i32 = 1024) => { - buf: [max_length] u8; - err := mvgetnstr(y, x, buf); - return string.alloc_copy(string.from_cstr(~~ buf)); -} - -wogetstr :: (w: WINDOW, $max_length: i32 = 1024) => { - buf: [max_length] u8; - err := wgetnstr(w, buf); - return string.alloc_copy(string.from_cstr(~~ buf)); -} - -mvwogetstr :: (w: WINDOW, y, x: i32, $max_length: i32 = 1024) => { - buf: [max_length] u8; - err := mvwgetnstr(w, y, x, buf); - return string.alloc_copy(string.from_cstr(~~ buf)); -} - -printw :: (fmt: str, args: ..any) { - buf: [1024] u8; - to_output := conv.format_va(buf, fmt, args); - addnstr(to_output); -} - -wprintw :: (w: WINDOW, fmt: str, args: ..any) { - buf: [1024] u8; - to_output := conv.format_va(buf, fmt, args); - waddnstr(w, to_output); -} - -mvprintw :: (y, x: i32, fmt: str, args: ..any) { - buf: [1024] u8; - to_output := conv.format_va(buf, fmt, args); - mvaddnstr(y, x, to_output); -} - -mvwprintw :: (w: WINDOW, y, x: i32, fmt: str, args: ..any) { - buf: [1024] u8; - to_output := conv.format_va(buf, fmt, args); - mvwaddnstr(w, y, x, to_output); -} - -BUTTON1_RELEASED :: 0x01 << (0 * 6) -BUTTON1_PRESSED :: 0x02 << (0 * 6) -BUTTON1_CLICKED :: 0x04 << (0 * 6) -BUTTON1_DOUBLE_CLICKED :: 0x08 << (0 * 6) -BUTTON1_TRIPLE_CLICKED :: 0x10 << (0 * 6) -BUTTON2_RELEASED :: 0x01 << (1 * 6) -BUTTON2_PRESSED :: 0x02 << (1 * 6) -BUTTON2_CLICKED :: 0x04 << (1 * 6) -BUTTON2_DOUBLE_CLICKED :: 0x08 << (1 * 6) -BUTTON2_TRIPLE_CLICKED :: 0x10 << (1 * 6) -BUTTON3_RELEASED :: 0x01 << (2 * 6) -BUTTON3_PRESSED :: 0x02 << (2 * 6) -BUTTON3_CLICKED :: 0x04 << (2 * 6) -BUTTON3_DOUBLE_CLICKED :: 0x08 << (2 * 6) -BUTTON3_TRIPLE_CLICKED :: 0x10 << (2 * 6) -BUTTON4_RELEASED :: 0x01 << (3 * 6) -BUTTON4_PRESSED :: 0x02 << (3 * 6) -BUTTON4_CLICKED :: 0x04 << (3 * 6) -BUTTON4_DOUBLE_CLICKED :: 0x08 << (3 * 6) -BUTTON4_TRIPLE_CLICKED :: 0x10 << (3 * 6) -BUTTON5_RELEASED :: 0x01 << (4 * 6) -BUTTON5_PRESSED :: 0x02 << (4 * 6) -BUTTON5_CLICKED :: 0x04 << (4 * 6) -BUTTON5_DOUBLE_CLICKED :: 0x08 << (4 * 6) -BUTTON5_TRIPLE_CLICKED :: 0x10 << (4 * 6) -BUTTON_CTRL :: 0x01 << (6 * 6) -BUTTON_SHIFT :: 0x02 << (6 * 6) -BUTTON_ALT :: 0x04 << (6 * 6) -REPORT_MOUSE_POSITION :: 0x08 << (6 * 6) - -BUTTON_RELEASE :: macro (e: mmask_t, button: i32) => (e & (1 << (button * 6))) != 0; -BUTTON_PRESS :: macro (e: mmask_t, button: i32) => (e & (2 << (button * 6))) != 0; -BUTTON_CLICK :: macro (e: mmask_t, button: i32) => (e & (4 << (button * 6))) != 0; -BUTTON_DOUBLE_CLICK :: macro (e: mmask_t, button: i32) => (e & (8 << (button * 6))) != 0; -BUTTON_TRIPLE_CLICK :: macro (e: mmask_t, button: i32) => (e & (16 << (button * 6))) != 0; - -ALL_MOUSE_EVENTS :: (1 << (7 * 6)) - 1 - -A_NORMAL :: 0 -A_ATTRIBUTES :: 0xffffff00 -A_CHARTEXT :: 0xff -A_COLOR :: 0xff00 -A_STANDOUT :: 0x00010000 -A_UNDERLINE :: 0x00020000 -A_REVERSE :: 0x00040000 -A_BLINK :: 0x00080000 -A_DIM :: 0x00100000 -A_BOLD :: 0x00200000 -A_ALTCHARSET :: 0x00400000 -A_INVIS :: 0x00800000 -A_PROTECT :: 0x01000000 -A_HORIZONTAL :: 0x02000000 -A_LEFT :: 0x04000000 -A_LOW :: 0x08000000 -A_RIGHT :: 0x10000000 -A_TOP :: 0x20000000 -A_VERTICAL :: 0x40000000 -A_ITALIC :: 0x80000000 - -COLOR_BLACK :: 0 -COLOR_RED :: 1 -COLOR_GREEN :: 2 -COLOR_YELLOW :: 3 -COLOR_BLUE :: 4 -COLOR_MAGENTA :: 5 -COLOR_CYAN :: 6 -COLOR_WHITE :: 7 - - -KEY_DOWN :: 0402 /* down-arrow key */ -KEY_UP :: 0403 /* up-arrow key */ -KEY_LEFT :: 0404 /* left-arrow key */ -KEY_RIGHT :: 0405 /* right-arrow key */ -KEY_HOME :: 0406 /* home key */ -KEY_BACKSPACE :: 0407 /* backspace key */ -KEY_F0 :: 0410 /* Function keys. Space for 64 */ -KEY_F :: macro (n) => KEY_FO + n /* Value of function key n */ -KEY_DL :: 0510 /* delete-line key */ -KEY_IL :: 0511 /* insert-line key */ -KEY_DC :: 0512 /* delete-character key */ -KEY_IC :: 0513 /* insert-character key */ -KEY_EIC :: 0514 /* sent by rmir or smir in insert mode */ -KEY_CLEAR :: 0515 /* clear-screen or erase key */ -KEY_EOS :: 0516 /* clear-to-end-of-screen key */ -KEY_EOL :: 0517 /* clear-to-end-of-line key */ -KEY_SF :: 0520 /* scroll-forward key */ -KEY_SR :: 0521 /* scroll-backward key */ -KEY_NPAGE :: 0522 /* next-page key */ -KEY_PPAGE :: 0523 /* previous-page key */ -KEY_STAB :: 0524 /* set-tab key */ -KEY_CTAB :: 0525 /* clear-tab key */ -KEY_CATAB :: 0526 /* clear-all-tabs key */ -KEY_ENTER :: 0527 /* enter/send key */ -KEY_PRINT :: 0532 /* print key */ -KEY_LL :: 0533 /* lower-left key (home down) */ -KEY_A1 :: 0534 /* upper left of keypad */ -KEY_A3 :: 0535 /* upper right of keypad */ -KEY_B2 :: 0536 /* center of keypad */ -KEY_C1 :: 0537 /* lower left of keypad */ -KEY_C3 :: 0540 /* lower right of keypad */ -KEY_BTAB :: 0541 /* back-tab key */ -KEY_BEG :: 0542 /* begin key */ -KEY_CANCEL :: 0543 /* cancel key */ -KEY_CLOSE :: 0544 /* close key */ -KEY_COMMAND :: 0545 /* command key */ -KEY_COPY :: 0546 /* copy key */ -KEY_CREATE :: 0547 /* create key */ -KEY_END :: 0550 /* end key */ -KEY_EXIT :: 0551 /* exit key */ -KEY_FIND :: 0552 /* find key */ -KEY_HELP :: 0553 /* help key */ -KEY_MARK :: 0554 /* mark key */ -KEY_MESSAGE :: 0555 /* message key */ -KEY_MOVE :: 0556 /* move key */ -KEY_NEXT :: 0557 /* next key */ -KEY_OPEN :: 0560 /* open key */ -KEY_OPTIONS :: 0561 /* options key */ -KEY_PREVIOUS :: 0562 /* previous key */ -KEY_REDO :: 0563 /* redo key */ -KEY_REFERENCE :: 0564 /* reference key */ -KEY_REFRESH :: 0565 /* refresh key */ -KEY_REPLACE :: 0566 /* replace key */ -KEY_RESTART :: 0567 /* restart key */ -KEY_RESUME :: 0570 /* resume key */ -KEY_SAVE :: 0571 /* save key */ -KEY_SBEG :: 0572 /* shifted begin key */ -KEY_SCANCEL :: 0573 /* shifted cancel key */ -KEY_SCOMMAND :: 0574 /* shifted command key */ -KEY_SCOPY :: 0575 /* shifted copy key */ -KEY_SCREATE :: 0576 /* shifted create key */ -KEY_SDC :: 0577 /* shifted delete-character key */ -KEY_SDL :: 0600 /* shifted delete-line key */ -KEY_SELECT :: 0601 /* select key */ -KEY_SEND :: 0602 /* shifted end key */ -KEY_SEOL :: 0603 /* shifted clear-to-end-of-line key */ -KEY_SEXIT :: 0604 /* shifted exit key */ -KEY_SFIND :: 0605 /* shifted find key */ -KEY_SHELP :: 0606 /* shifted help key */ -KEY_SHOME :: 0607 /* shifted home key */ -KEY_SIC :: 0610 /* shifted insert-character key */ -KEY_SLEFT :: 0611 /* shifted left-arrow key */ -KEY_SMESSAGE :: 0612 /* shifted message key */ -KEY_SMOVE :: 0613 /* shifted move key */ -KEY_SNEXT :: 0614 /* shifted next key */ -KEY_SOPTIONS :: 0615 /* shifted options key */ -KEY_SPREVIOUS :: 0616 /* shifted previous key */ -KEY_SPRINT :: 0617 /* shifted print key */ -KEY_SREDO :: 0620 /* shifted redo key */ -KEY_SREPLACE :: 0621 /* shifted replace key */ -KEY_SRIGHT :: 0622 /* shifted right-arrow key */ -KEY_SRSUME :: 0623 /* shifted resume key */ -KEY_SSAVE :: 0624 /* shifted save key */ -KEY_SSUSPEND :: 0625 /* shifted suspend key */ -KEY_SUNDO :: 0626 /* shifted undo key */ -KEY_SUSPEND :: 0627 /* suspend key */ -KEY_UNDO :: 0630 /* undo key */ -KEY_MOUSE :: 0631 /* Mouse event has occurred */ - - - -} // !Building_Library \ No newline at end of file diff --git a/modules/ncurses/ncurses.c b/modules/ncurses/ncurses.c deleted file mode 100644 index efc67a62..00000000 --- a/modules/ncurses/ncurses.c +++ /dev/null @@ -1,1632 +0,0 @@ -// -// THIS FILE WAS AUTOMATICALLY GENERATED. -// - -#include "ncurses.h" - -#define __get_stdscr() ((unsigned long int) stdscr) - -void __get_yx (WINDOW *w, int *y, int *x) { getyx(w, *y, *x); } -void __get_par_yx(WINDOW *w, int *y, int *x) { getparyx(w, *y, *x); } -void __get_beg_yx(WINDOW *w, int *y, int *x) { getbegyx(w, *y, *x); } -void __get_max_yx(WINDOW *w, int *y, int *x) { getmaxyx(w, *y, *x); } - - -#define ONYX_LIBRARY_NAME onyx_ncurses -#include "onyx_library.h" - -#define P(i, k) (params->data[i].of.k) - -ONYX_DEF(initscr, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(initscr()); - return NULL; -} - -ONYX_DEF(endwin, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(endwin()); - return NULL; -} - -ONYX_DEF(isendwin, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(isendwin()); - return NULL; -} - -ONYX_DEF(newterm, (WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(newterm(ONYX_PTR(P(0, i32)), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(set_term, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(set_term(P(0, i64))); - return NULL; -} - -ONYX_DEF(delscreen, (WASM_I64), ()) { - delscreen(P(0, i64)); - return NULL; -} - -ONYX_DEF(exit_curses, (WASM_I32), ()) { - exit_curses(P(0, i32)); - return NULL; -} - -ONYX_DEF(start_color, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(start_color()); - return NULL; -} - -ONYX_DEF(has_colors, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(has_colors()); - return NULL; -} - -ONYX_DEF(can_change_color, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(can_change_color()); - return NULL; -} - -ONYX_DEF(init_pair, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(init_pair(P(0, i32), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(init_color, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(init_color(P(0, i32), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(color_content, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(color_content(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(pair_content, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(pair_content(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(reset_color_pairs, (), ()) { - reset_color_pairs(); - return NULL; -} - -ONYX_DEF(COLOR_PAIR, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(COLOR_PAIR(P(0, i32))); - return NULL; -} - -ONYX_DEF(PAIR_NUMBER, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(PAIR_NUMBER(P(0, i32))); - return NULL; -} - -ONYX_DEF(cbreak, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(cbreak()); - return NULL; -} - -ONYX_DEF(nocbreak, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(nocbreak()); - return NULL; -} - -ONYX_DEF(echo, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(echo()); - return NULL; -} - -ONYX_DEF(noecho, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(noecho()); - return NULL; -} - -ONYX_DEF(intrflush, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(intrflush((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(keypad, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(keypad((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(meta, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(meta((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(nodelay, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(nodelay((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(notimeout, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(notimeout((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(nl, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(nl()); - return NULL; -} - -ONYX_DEF(nonl, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(nonl()); - return NULL; -} - -ONYX_DEF(raw, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(raw()); - return NULL; -} - -ONYX_DEF(noraw, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(noraw()); - return NULL; -} - -ONYX_DEF(qiflush, (), ()) { - qiflush(); - return NULL; -} - -ONYX_DEF(noqiflush, (), ()) { - noqiflush(); - return NULL; -} - -ONYX_DEF(halfdelay, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(halfdelay(P(0, i32))); - return NULL; -} - -ONYX_DEF(timeout, (WASM_I32), ()) { - timeout(P(0, i32)); - return NULL; -} - -ONYX_DEF(wtimeout, (WASM_I64, WASM_I32), ()) { - wtimeout((WINDOW *) P(0, i64), P(1, i32)); - return NULL; -} - -ONYX_DEF(typeahead, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(typeahead(P(0, i32))); - return NULL; -} - -ONYX_DEF(clearkok, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(clearkok((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(idlok, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(idlok((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(idcok, (WASM_I64, WASM_I32), ()) { - idcok((WINDOW *) P(0, i64), P(1, i32)); - return NULL; -} - -ONYX_DEF(immedok, (WASM_I64, WASM_I32), ()) { - immedok((WINDOW *) P(0, i64), P(1, i32)); - return NULL; -} - -ONYX_DEF(leaveok, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(leaveok((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(scrollok, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(scrollok((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(setscrreg, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(setscrreg(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(wsetscrreg, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wsetscrreg((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(attr_get, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attr_get(ONYX_PTR(P(0, i32)), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(wattr_get, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattr_get((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(attr_set, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attr_set(ONYX_PTR(P(0, i32)), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(wattr_set, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattr_set((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(attr_off, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attr_off(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(wattr_off, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattr_off((WINDOW *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(attr_on, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attr_on(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(wattr_on, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattr_on((WINDOW *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(attroff, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attroff(P(0, i32))); - return NULL; -} - -ONYX_DEF(wattroff, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattroff((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(attron, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attron(P(0, i32))); - return NULL; -} - -ONYX_DEF(wattron, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattron((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(attrset, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(attrset(P(0, i32))); - return NULL; -} - -ONYX_DEF(wattrset, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wattrset((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(chgat, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(chgat(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(wchgat, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wchgat((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), ONYX_PTR(P(4, i32)))); - return NULL; -} - -ONYX_DEF(mvchgat, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvchgat(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), ONYX_PTR(P(5, i32)))); - return NULL; -} - -ONYX_DEF(mvmchgat, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvmchgat((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), ONYX_PTR(P(6, i32)))); - return NULL; -} - -ONYX_DEF(color_set, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(color_set(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(wcolor_set, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wcolor_set((WINDOW *) P(0, i64), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(standend, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(standend()); - return NULL; -} - -ONYX_DEF(wstandend, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wstandend((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(standout, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(standout()); - return NULL; -} - -ONYX_DEF(wstandout, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wstandout((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(unctrl, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(unctrl(P(0, i32))); - return NULL; -} - -ONYX_DEF(keyname, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(keyname(P(0, i32))); - return NULL; -} - -ONYX_DEF(key_name, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(key_name(P(0, i32))); - return NULL; -} - -ONYX_DEF(filter, (), ()) { - filter(); - return NULL; -} - -ONYX_DEF(nofilter, (), ()) { - nofilter(); - return NULL; -} - -ONYX_DEF(use_env, (WASM_I32), ()) { - use_env(P(0, i32)); - return NULL; -} - -ONYX_DEF(use_tioctl, (WASM_I32), ()) { - use_tioctl(P(0, i32)); - return NULL; -} - -ONYX_DEF(getwin, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(getwin(P(0, i32))); - return NULL; -} - -ONYX_DEF(delay_output, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(delay_output(P(0, i32))); - return NULL; -} - -ONYX_DEF(flushinp, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(flushinp()); - return NULL; -} - -ONYX_DEF(def_prog_mode, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(def_prog_mode()); - return NULL; -} - -ONYX_DEF(def_shell_mode, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(def_shell_mode()); - return NULL; -} - -ONYX_DEF(reset_prog_mode, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(reset_prog_mode()); - return NULL; -} - -ONYX_DEF(reset_shell_mode, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(reset_shell_mode()); - return NULL; -} - -ONYX_DEF(resetty, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(resetty()); - return NULL; -} - -ONYX_DEF(savetty, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(savetty()); - return NULL; -} - -ONYX_DEF(getsyx, (WASM_I32, WASM_I32), ()) { - getsyx(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(setsyx, (WASM_I32, WASM_I32), ()) { - setsyx(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(curs_set, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(curs_set(P(0, i32))); - return NULL; -} - -ONYX_DEF(napms, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(napms(P(0, i32))); - return NULL; -} - -ONYX_DEF(refresh, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(refresh()); - return NULL; -} - -ONYX_DEF(wrefresh, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wrefresh((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(wnoutrefresh, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wnoutrefresh((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(doupdate, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(doupdate()); - return NULL; -} - -ONYX_DEF(redrawwin, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(redrawwin((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(wredrawln, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wredrawln((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(addch, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(addch(P(0, i32))); - return NULL; -} - -ONYX_DEF(waddch, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(waddch((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(mvaddch, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvaddch(P(0, i32), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(mvwaddch, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwaddch((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(echochar, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(echochar(P(0, i32))); - return NULL; -} - -ONYX_DEF(wechochar, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wechochar((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(addchstr, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(addchstr(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(addchnstr, (WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(addchnstr(ONYX_PTR(P(0, i32)), P(1, i32))); - return NULL; -} - -ONYX_DEF(waddchstr, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(waddchstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(waddchnstr, (WASM_I64, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(waddchnstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32))); - return NULL; -} - -ONYX_DEF(mvaddchstr, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvaddchstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(mvaddchnstr, (WASM_I32, WASM_I32, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvaddchnstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32))); - return NULL; -} - -ONYX_DEF(mvwaddchstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwaddchstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(mvwaddchnstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwaddchnstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32))); - return NULL; -} - -ONYX_DEF(addstr, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(addstr(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(addnstr, (WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(addnstr(ONYX_PTR(P(0, i32)), P(1, i32))); - return NULL; -} - -ONYX_DEF(waddstr, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(waddstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(waddnstr, (WASM_I64, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(waddnstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32))); - return NULL; -} - -ONYX_DEF(mvaddstr, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvaddstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(mvaddnstr, (WASM_I32, WASM_I32, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvaddnstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32))); - return NULL; -} - -ONYX_DEF(mvwaddstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwaddstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(mvwaddnstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwaddnstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32))); - return NULL; -} - -ONYX_DEF(erase, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(erase()); - return NULL; -} - -ONYX_DEF(werase, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(werase((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(clear, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(clear()); - return NULL; -} - -ONYX_DEF(wclear, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wclear((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(clrtobot, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(clrtobot()); - return NULL; -} - -ONYX_DEF(wclrtobot, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wclrtobot((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(clrtoeol, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(clrtoeol()); - return NULL; -} - -ONYX_DEF(wclrtoeol, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wclrtoeol((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_cleared, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_cleared((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_idcok, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_idcok((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_idlok, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_idlok((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_immedok, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_immedok((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_keypad, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_keypad((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_leaveok, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_leaveok((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_nodelay, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_nodelay((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_notimeout, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_notimeout((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_pad, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_pad((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_scrollok, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_scrollok((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_subwin, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_subwin((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_syncok, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_syncok((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(wgetparent, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(wgetparent((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(wgetdelay, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wgetdelay((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(newwin, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(newwin(P(0, i32), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(delwin, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(delwin((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(mvwin, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(subwin, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(subwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32))); - return NULL; -} - -ONYX_DEF(derwin, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(derwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32))); - return NULL; -} - -ONYX_DEF(mvderwin, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvderwin((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(dupwin, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(dupwin((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(wsyncup, (WASM_I64), ()) { - wsyncup((WINDOW *) P(0, i64)); - return NULL; -} - -ONYX_DEF(syncok, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(syncok((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(wcursyncup, (WASM_I64), ()) { - wcursyncup((WINDOW *) P(0, i64)); - return NULL; -} - -ONYX_DEF(wsyncdown, (WASM_I64), ()) { - wsyncdown((WINDOW *) P(0, i64)); - return NULL; -} - -ONYX_DEF(touchline, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(touchline((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(touchwin, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(touchwin((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(wtouchln, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wtouchln((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(untouchwin, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(untouchwin((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(is_linetouched, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_linetouched((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(is_wintouched, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_wintouched((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(bkgdset, (WASM_I32), ()) { - bkgdset(P(0, i32)); - return NULL; -} - -ONYX_DEF(wbkgdset, (WASM_I64, WASM_I32), ()) { - wbkgdset((WINDOW *) P(0, i64), P(1, i32)); - return NULL; -} - -ONYX_DEF(bkgd, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(bkgd(P(0, i32))); - return NULL; -} - -ONYX_DEF(wbkgd, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wbkgd((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(getbkgd, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getbkgd((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(inch, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(inch()); - return NULL; -} - -ONYX_DEF(winch, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(winch((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(mvinch, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvinch(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(mvwinch, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwinch((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(getch, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getch()); - return NULL; -} - -ONYX_DEF(wgetch, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wgetch((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(mvgetch, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvgetch(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(mvwgetch, (WASM_I32, WASM_I32, WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwgetch(P(0, i32), P(1, i32), (WINDOW *) P(2, i64))); - return NULL; -} - -ONYX_DEF(ungetch, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(ungetch(P(0, i32))); - return NULL; -} - -ONYX_DEF(has_key, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(has_key(P(0, i32))); - return NULL; -} - -ONYX_DEF(__get_yx, (WASM_I64, WASM_I32, WASM_I32), ()) { - __get_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(__get_par_yx, (WASM_I64, WASM_I32, WASM_I32), ()) { - __get_par_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(__get_beg_yx, (WASM_I64, WASM_I32, WASM_I32), ()) { - __get_beg_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(__get_max_yx, (WASM_I64, WASM_I32, WASM_I32), ()) { - __get_max_yx((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(getstr, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getstr(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(getnstr, (WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getnstr(ONYX_PTR(P(0, i32)), P(1, i32))); - return NULL; -} - -ONYX_DEF(wgetstr, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wgetstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(wgetnstr, (WASM_I64, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wgetnstr((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32))); - return NULL; -} - -ONYX_DEF(mvgetstr, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvgetstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)))); - return NULL; -} - -ONYX_DEF(mvgetnstr, (WASM_I32, WASM_I32, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvgetnstr(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32))); - return NULL; -} - -ONYX_DEF(mvwgetstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwgetstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)))); - return NULL; -} - -ONYX_DEF(mvwgetnstr, (WASM_I64, WASM_I32, WASM_I32, WASM_I32,WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwgetnstr((WINDOW *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32))); - return NULL; -} - -ONYX_DEF(border, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(border(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32))); - return NULL; -} - -ONYX_DEF(wborder, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wborder((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32))); - return NULL; -} - -ONYX_DEF(box, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(box((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(hline, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(hline(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(whline, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(whline((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(vline, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(vline(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(wvline, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wvline((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(mvhline, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvhline(P(0, i32), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(mvwhline, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwhline((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32))); - return NULL; -} - -ONYX_DEF(mvvline, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvvline(P(0, i32), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(mvwvline, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwvline((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32))); - return NULL; -} - -ONYX_DEF(allow_pair, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(allow_pair(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(find_pair, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(find_pair(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(free_pair, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(free_pair(P(0, i32))); - return NULL; -} - -ONYX_DEF(use_default_colors, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(use_default_colors()); - return NULL; -} - -ONYX_DEF(assume_default_colors, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(assume_default_colors(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(buadrate, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(buadrate()); - return NULL; -} - -ONYX_DEF(erasechar, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(erasechar()); - return NULL; -} - -ONYX_DEF(has_ic, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(has_ic()); - return NULL; -} - -ONYX_DEF(has_il, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(has_il()); - return NULL; -} - -ONYX_DEF(killchar, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(killchar()); - return NULL; -} - -ONYX_DEF(longname, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(longname()); - return NULL; -} - -ONYX_DEF(term_attrs, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(term_attrs()); - return NULL; -} - -ONYX_DEF(termattrs, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(termattrs()); - return NULL; -} - -ONYX_DEF(termname, (), ()) { - termname(); - return NULL; -} - -ONYX_DEF(beep, (), ()) { - beep(); - return NULL; -} - -ONYX_DEF(flash, (), ()) { - flash(); - return NULL; -} - -ONYX_DEF(overlay, (WASM_I64, WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(overlay((WINDOW *) P(0, i64), (WINDOW *) P(1, i64))); - return NULL; -} - -ONYX_DEF(overwrite, (WASM_I64, WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(overwrite((WINDOW *) P(0, i64), (WINDOW *) P(1, i64))); - return NULL; -} - -ONYX_DEF(copywin, (WASM_I64, WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(copywin((WINDOW *) P(0, i64), (WINDOW *) P(1, i64), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32))); - return NULL; -} - -ONYX_DEF(newpad, (WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(newpad(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(subpad, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(subpad((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32))); - return NULL; -} - -ONYX_DEF(prefresh, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(prefresh((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32))); - return NULL; -} - -ONYX_DEF(pnoutrefresh, (WASM_I64, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(pnoutrefresh((WINDOW *) P(0, i64), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32))); - return NULL; -} - -ONYX_DEF(pechochar, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(pechochar((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(define_key, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(define_key(ONYX_PTR(P(0, i32)), P(1, i32))); - return NULL; -} - -ONYX_DEF(keyok, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(keyok(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(key_defined, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(key_defined(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(delch, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(delch()); - return NULL; -} - -ONYX_DEF(wdelch, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wdelch((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(mvdelch, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvdelch(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(mvwdelch, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mvwdelch((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(deleteln, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(deleteln()); - return NULL; -} - -ONYX_DEF(wdeleteln, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wdeleteln((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(insdelln, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(insdelln(P(0, i32))); - return NULL; -} - -ONYX_DEF(winsdelln, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(winsdelln((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(insertln, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(insertln()); - return NULL; -} - -ONYX_DEF(winsertln, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(winsertln((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(slk_init, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_init(P(0, i32))); - return NULL; -} - -ONYX_DEF(slk_set, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_set(P(0, i32), ONYX_PTR(P(1, i32)), P(2, i32))); - return NULL; -} - -ONYX_DEF(slk_label, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(slk_label(P(0, i32))); - return NULL; -} - -ONYX_DEF(slk_refresh, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_refresh()); - return NULL; -} - -ONYX_DEF(slk_noutrefresh, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_noutrefresh()); - return NULL; -} - -ONYX_DEF(slk_clear, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_clear()); - return NULL; -} - -ONYX_DEF(slk_restore, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_restore()); - return NULL; -} - -ONYX_DEF(slk_touch, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_touch()); - return NULL; -} - -ONYX_DEF(slk_attron, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_attron(P(0, i32))); - return NULL; -} - -ONYX_DEF(slk_attroff, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_attroff(P(0, i32))); - return NULL; -} - -ONYX_DEF(slk_attrset, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_attrset(P(0, i32))); - return NULL; -} - -ONYX_DEF(slk_attr, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_attr()); - return NULL; -} - -ONYX_DEF(slk_color, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(slk_color(P(0, i32))); - return NULL; -} - -ONYX_DEF(getattrs, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getattrs((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getbegx, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getbegx((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getbegy, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getbegy((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getcurx, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getcurx((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getcury, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getcury((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getmaxx, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getmaxx((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getmaxy, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getmaxy((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getparx, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getparx((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(getpary, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getpary((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(has_mouse, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(has_mouse()); - return NULL; -} - -ONYX_DEF(getmouse, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(getmouse(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(ungetmouse, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(ungetmouse(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(mousemask, (WASM_I64, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(mousemask(P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(wenclose, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wenclose((WINDOW *) P(0, i64), P(1, i32), P(2, i32))); - return NULL; -} - -ONYX_DEF(mouse_trafo, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mouse_trafo(ONYX_PTR(P(0, i32)), ONYX_PTR(P(1, i32)), P(2, i32))); - return NULL; -} - -ONYX_DEF(wmouse_trafo, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wmouse_trafo((WINDOW *) P(0, i64), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), P(3, i32))); - return NULL; -} - -ONYX_DEF(mouseinterval, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(mouseinterval(P(0, i32))); - return NULL; -} - -ONYX_DEF(is_term_resized, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(is_term_resized(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(resize_term, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(resize_term(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(resizeterm, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(resizeterm(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(scroll, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(scroll((WINDOW *) P(0, i64))); - return NULL; -} - -ONYX_DEF(scrl, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(scrl(P(0, i32))); - return NULL; -} - -ONYX_DEF(wscrl, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(wscrl((WINDOW *) P(0, i64), P(1, i32))); - return NULL; -} - -ONYX_DEF(__get_stdscr, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(__get_stdscr()); - return NULL; -} - -ONYX_DEF(NCURSES_ACS, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(NCURSES_ACS(P(0, i32))); - return NULL; -} - - - -ONYX_LIBRARY { - ONYX_FUNC(initscr) - ONYX_FUNC(endwin) - ONYX_FUNC(isendwin) - ONYX_FUNC(newterm) - ONYX_FUNC(set_term) - ONYX_FUNC(delscreen) - ONYX_FUNC(exit_curses) - ONYX_FUNC(start_color) - ONYX_FUNC(has_colors) - ONYX_FUNC(can_change_color) - ONYX_FUNC(init_pair) - ONYX_FUNC(init_color) - ONYX_FUNC(color_content) - ONYX_FUNC(pair_content) - ONYX_FUNC(reset_color_pairs) - ONYX_FUNC(COLOR_PAIR) - ONYX_FUNC(PAIR_NUMBER) - ONYX_FUNC(cbreak) - ONYX_FUNC(nocbreak) - ONYX_FUNC(echo) - ONYX_FUNC(noecho) - ONYX_FUNC(intrflush) - ONYX_FUNC(keypad) - ONYX_FUNC(meta) - ONYX_FUNC(nodelay) - ONYX_FUNC(notimeout) - ONYX_FUNC(nl) - ONYX_FUNC(nonl) - ONYX_FUNC(raw) - ONYX_FUNC(noraw) - ONYX_FUNC(qiflush) - ONYX_FUNC(noqiflush) - ONYX_FUNC(halfdelay) - ONYX_FUNC(timeout) - ONYX_FUNC(wtimeout) - ONYX_FUNC(typeahead) - ONYX_FUNC(clearkok) - ONYX_FUNC(idlok) - ONYX_FUNC(idcok) - ONYX_FUNC(immedok) - ONYX_FUNC(leaveok) - ONYX_FUNC(scrollok) - ONYX_FUNC(setscrreg) - ONYX_FUNC(wsetscrreg) - ONYX_FUNC(attr_get) - ONYX_FUNC(wattr_get) - ONYX_FUNC(attr_set) - ONYX_FUNC(wattr_set) - ONYX_FUNC(attr_off) - ONYX_FUNC(wattr_off) - ONYX_FUNC(attr_on) - ONYX_FUNC(wattr_on) - ONYX_FUNC(attroff) - ONYX_FUNC(wattroff) - ONYX_FUNC(attron) - ONYX_FUNC(wattron) - ONYX_FUNC(attrset) - ONYX_FUNC(wattrset) - ONYX_FUNC(chgat) - ONYX_FUNC(wchgat) - ONYX_FUNC(mvchgat) - ONYX_FUNC(mvmchgat) - ONYX_FUNC(color_set) - ONYX_FUNC(wcolor_set) - ONYX_FUNC(standend) - ONYX_FUNC(wstandend) - ONYX_FUNC(standout) - ONYX_FUNC(wstandout) - ONYX_FUNC(unctrl) - ONYX_FUNC(keyname) - ONYX_FUNC(key_name) - ONYX_FUNC(filter) - ONYX_FUNC(nofilter) - ONYX_FUNC(use_env) - ONYX_FUNC(use_tioctl) - ONYX_FUNC(getwin) - ONYX_FUNC(delay_output) - ONYX_FUNC(flushinp) - ONYX_FUNC(def_prog_mode) - ONYX_FUNC(def_shell_mode) - ONYX_FUNC(reset_prog_mode) - ONYX_FUNC(reset_shell_mode) - ONYX_FUNC(resetty) - ONYX_FUNC(savetty) - ONYX_FUNC(getsyx) - ONYX_FUNC(setsyx) - ONYX_FUNC(curs_set) - ONYX_FUNC(napms) - ONYX_FUNC(refresh) - ONYX_FUNC(wrefresh) - ONYX_FUNC(wnoutrefresh) - ONYX_FUNC(doupdate) - ONYX_FUNC(redrawwin) - ONYX_FUNC(wredrawln) - ONYX_FUNC(addch) - ONYX_FUNC(waddch) - ONYX_FUNC(mvaddch) - ONYX_FUNC(mvwaddch) - ONYX_FUNC(echochar) - ONYX_FUNC(wechochar) - ONYX_FUNC(addchstr) - ONYX_FUNC(addchnstr) - ONYX_FUNC(waddchstr) - ONYX_FUNC(waddchnstr) - ONYX_FUNC(mvaddchstr) - ONYX_FUNC(mvaddchnstr) - ONYX_FUNC(mvwaddchstr) - ONYX_FUNC(mvwaddchnstr) - ONYX_FUNC(addstr) - ONYX_FUNC(addnstr) - ONYX_FUNC(waddstr) - ONYX_FUNC(waddnstr) - ONYX_FUNC(mvaddstr) - ONYX_FUNC(mvaddnstr) - ONYX_FUNC(mvwaddstr) - ONYX_FUNC(mvwaddnstr) - ONYX_FUNC(erase) - ONYX_FUNC(werase) - ONYX_FUNC(clear) - ONYX_FUNC(wclear) - ONYX_FUNC(clrtobot) - ONYX_FUNC(wclrtobot) - ONYX_FUNC(clrtoeol) - ONYX_FUNC(wclrtoeol) - ONYX_FUNC(is_cleared) - ONYX_FUNC(is_idcok) - ONYX_FUNC(is_idlok) - ONYX_FUNC(is_immedok) - ONYX_FUNC(is_keypad) - ONYX_FUNC(is_leaveok) - ONYX_FUNC(is_nodelay) - ONYX_FUNC(is_notimeout) - ONYX_FUNC(is_pad) - ONYX_FUNC(is_scrollok) - ONYX_FUNC(is_subwin) - ONYX_FUNC(is_syncok) - ONYX_FUNC(wgetparent) - ONYX_FUNC(wgetdelay) - ONYX_FUNC(newwin) - ONYX_FUNC(delwin) - ONYX_FUNC(mvwin) - ONYX_FUNC(subwin) - ONYX_FUNC(derwin) - ONYX_FUNC(mvderwin) - ONYX_FUNC(dupwin) - ONYX_FUNC(wsyncup) - ONYX_FUNC(syncok) - ONYX_FUNC(wcursyncup) - ONYX_FUNC(wsyncdown) - ONYX_FUNC(touchline) - ONYX_FUNC(touchwin) - ONYX_FUNC(wtouchln) - ONYX_FUNC(untouchwin) - ONYX_FUNC(is_linetouched) - ONYX_FUNC(is_wintouched) - ONYX_FUNC(bkgdset) - ONYX_FUNC(wbkgdset) - ONYX_FUNC(bkgd) - ONYX_FUNC(wbkgd) - ONYX_FUNC(getbkgd) - ONYX_FUNC(inch) - ONYX_FUNC(winch) - ONYX_FUNC(mvinch) - ONYX_FUNC(mvwinch) - ONYX_FUNC(getch) - ONYX_FUNC(wgetch) - ONYX_FUNC(mvgetch) - ONYX_FUNC(mvwgetch) - ONYX_FUNC(ungetch) - ONYX_FUNC(has_key) - ONYX_FUNC(__get_yx) - ONYX_FUNC(__get_par_yx) - ONYX_FUNC(__get_beg_yx) - ONYX_FUNC(__get_max_yx) - ONYX_FUNC(getstr) - ONYX_FUNC(getnstr) - ONYX_FUNC(wgetstr) - ONYX_FUNC(wgetnstr) - ONYX_FUNC(mvgetstr) - ONYX_FUNC(mvgetnstr) - ONYX_FUNC(mvwgetstr) - ONYX_FUNC(mvwgetnstr) - ONYX_FUNC(border) - ONYX_FUNC(wborder) - ONYX_FUNC(box) - ONYX_FUNC(hline) - ONYX_FUNC(whline) - ONYX_FUNC(vline) - ONYX_FUNC(wvline) - ONYX_FUNC(mvhline) - ONYX_FUNC(mvwhline) - ONYX_FUNC(mvvline) - ONYX_FUNC(mvwvline) - ONYX_FUNC(allow_pair) - ONYX_FUNC(find_pair) - ONYX_FUNC(free_pair) - ONYX_FUNC(use_default_colors) - ONYX_FUNC(assume_default_colors) - ONYX_FUNC(buadrate) - ONYX_FUNC(erasechar) - ONYX_FUNC(has_ic) - ONYX_FUNC(has_il) - ONYX_FUNC(killchar) - ONYX_FUNC(longname) - ONYX_FUNC(term_attrs) - ONYX_FUNC(termattrs) - ONYX_FUNC(termname) - ONYX_FUNC(beep) - ONYX_FUNC(flash) - ONYX_FUNC(overlay) - ONYX_FUNC(overwrite) - ONYX_FUNC(copywin) - ONYX_FUNC(newpad) - ONYX_FUNC(subpad) - ONYX_FUNC(prefresh) - ONYX_FUNC(pnoutrefresh) - ONYX_FUNC(pechochar) - ONYX_FUNC(define_key) - ONYX_FUNC(keyok) - ONYX_FUNC(key_defined) - ONYX_FUNC(delch) - ONYX_FUNC(wdelch) - ONYX_FUNC(mvdelch) - ONYX_FUNC(mvwdelch) - ONYX_FUNC(deleteln) - ONYX_FUNC(wdeleteln) - ONYX_FUNC(insdelln) - ONYX_FUNC(winsdelln) - ONYX_FUNC(insertln) - ONYX_FUNC(winsertln) - ONYX_FUNC(slk_init) - ONYX_FUNC(slk_set) - ONYX_FUNC(slk_label) - ONYX_FUNC(slk_refresh) - ONYX_FUNC(slk_noutrefresh) - ONYX_FUNC(slk_clear) - ONYX_FUNC(slk_restore) - ONYX_FUNC(slk_touch) - ONYX_FUNC(slk_attron) - ONYX_FUNC(slk_attroff) - ONYX_FUNC(slk_attrset) - ONYX_FUNC(slk_attr) - ONYX_FUNC(slk_color) - ONYX_FUNC(getattrs) - ONYX_FUNC(getbegx) - ONYX_FUNC(getbegy) - ONYX_FUNC(getcurx) - ONYX_FUNC(getcury) - ONYX_FUNC(getmaxx) - ONYX_FUNC(getmaxy) - ONYX_FUNC(getparx) - ONYX_FUNC(getpary) - ONYX_FUNC(has_mouse) - ONYX_FUNC(getmouse) - ONYX_FUNC(ungetmouse) - ONYX_FUNC(mousemask) - ONYX_FUNC(wenclose) - ONYX_FUNC(mouse_trafo) - ONYX_FUNC(wmouse_trafo) - ONYX_FUNC(mouseinterval) - ONYX_FUNC(is_term_resized) - ONYX_FUNC(resize_term) - ONYX_FUNC(resizeterm) - ONYX_FUNC(scroll) - ONYX_FUNC(scrl) - ONYX_FUNC(wscrl) - ONYX_FUNC(__get_stdscr) - ONYX_FUNC(NCURSES_ACS) - NULL -}; \ No newline at end of file diff --git a/modules/ncurses/onyx_ncurses.so b/modules/ncurses/onyx_ncurses.so deleted file mode 100755 index b92ce9e5..00000000 Binary files a/modules/ncurses/onyx_ncurses.so and /dev/null differ diff --git a/modules/openal/ build.bat b/modules/openal/ build.bat deleted file mode 100644 index e6e9f6d5..00000000 --- a/modules/openal/ build.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off - -onyx run modules/openal/build --generate-foreign-info -cl /MT /std:c17 /TC /I include /I lib/common/include /I "C:\Program Files (x86)\OpenAL 1.1 SDK\include" /D_USRDLL /D_WINDLL modules\openal\onyx_openal.c /link "C:\Program Files (x86)\OpenAL 1.1 SDK\libs\Win64\OpenAL32.lib" /DLL /OUT:onyx_openal.dll \ No newline at end of file diff --git a/modules/openal/build.onyx b/modules/openal/build.onyx deleted file mode 100644 index 390cfbe4..00000000 --- a/modules/openal/build.onyx +++ /dev/null @@ -1,32 +0,0 @@ -#load "core/std" -#load "scripts/c_binding" -#load "./module" - -use package core -use package c_binding - -main :: () { - result := build_c_binding(.{ - output_file = "modules/openal/onyx_openal.c", - foreign_block = (package openal).foreign_block, - - cast_map = .[ - .{ (package openal).ALCdevice, "ALCdevice *" }, - .{ (package openal).ALCcontext, "ALCcontext *" }, - ], - - preamble = .[ -""" -#include -#include -""" - ], - }); - - if !result { - println("Failed to make c-file."); - os.exit(1); - } else { - println("Sucessfully made openal.c"); - } -} \ No newline at end of file diff --git a/modules/openal/build.sh b/modules/openal/build.sh deleted file mode 100755 index 18c95210..00000000 --- a/modules/openal/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#/bin/sh - -onyx run modules/openal/build --generate-foreign-info -gcc -shared -fPIC modules/openal/onyx_openal.c -lopenal -I include -I lib/common/include -o ./modules/openal/onyx_openal.so \ No newline at end of file diff --git a/modules/openal/module.onyx b/modules/openal/module.onyx deleted file mode 100644 index ece089bf..00000000 --- a/modules/openal/module.onyx +++ /dev/null @@ -1,563 +0,0 @@ -package openal - -use package core { cptr } - -#if #defined((package runtime).Generated_Foreign_Info) { - foreign_block :: __foreign_block -} else { - #library "onyx_openal" -} - -ALCdevice :: #distinct u64 -ALCcontext :: #distinct u64 -ALCextfunc :: #distinct u64 - -#local __foreign_block :: #foreign "onyx_openal" { - alGenBuffers :: (n: i32, buffers: ^u32) -> void --- - alDeleteBuffers :: (n: i32, buffers: ^u32) -> void --- - alIsBuffer :: (buffer: u32) -> bool --- - alBufferData :: (buffer: u32, format: i32, data: rawptr, size: i32, freq: i32) -> void --- - alBufferf :: (buffer: u32, param: i32, value: f32) -> void --- - alBuffer3f :: (buffer: u32, param: i32, v1, v2, v3: f32) -> void --- - alBufferfv :: (buffer: u32, param: i32, values: ^f32) -> void --- - alBufferi :: (buffer: u32, param: i32, value: i32) -> void --- - alBuffer3i :: (buffer: u32, param: i32, v1, v2, v3: i32) -> void --- - alBufferiv :: (buffer: u32, param: i32, values: ^i32) -> void --- - alGetBufferf :: (buffer: u32, param: i32, value: ^f32) -> void --- - alGetBuffer3f :: (buffer: u32, param: i32, v1, v2, v3: ^f32) -> void --- - alGetBufferfv :: (buffer: u32, param: i32, values: ^f32) -> void --- - alGetBufferi :: (buffer: u32, param: i32, value: ^i32) -> void --- - alGetBuffer3i :: (buffer: u32, param: i32, v1, v2, v3: ^i32) -> void --- - alGetBufferiv :: (buffer: u32, param: i32, values: ^i32) -> void --- - - alGenSources :: (n: i32, sources: ^u32) -> void --- - alDeleteSources :: (n: i32, sources: ^u32) -> void --- - alIsSource :: (source: u32) -> bool --- - alSourcef :: (source: u32, param: i32, value: f32) -> void --- - alSource3f :: (source: u32, param: i32, v1, v2, v3: f32) -> void --- - alSourcefv :: (source: u32, param: i32, values: ^f32) -> void --- - alSourcei :: (source: u32, param: i32, value: i32) -> void --- - alSource3i :: (source: u32, param: i32, v1, v2, v3: i32) -> void --- - alSourceiv :: (source: u32, param: i32, values: ^i32) -> void --- - alGetSourcef :: (source: u32, param: i32, value: ^f32) -> void --- - alGetSource3f :: (source: u32, param: i32, v1, v2, v3: ^f32) -> void --- - alGetSourcefv :: (source: u32, param: i32, values: ^f32) -> void --- - alGetSourcei :: (source: u32, param: i32, value: ^i32) -> void --- - alGetSource3i :: (source: u32, param: i32, v1, v2, v3: ^i32) -> void --- - alGetSourceiv :: (source: u32, param: i32, values: ^i32) -> void --- - alSourcePlay :: (source: u32) -> void --- - alSourcePlayv :: (n: i32, sources: ^u32) -> void --- - alSourcePause :: (source: u32) -> void --- - alSourcePausev :: (n: i32, sources: ^u32) -> void --- - alSourceStop :: (source: u32) -> void --- - alSourceStopv :: (n: i32, sources: ^u32) -> void --- - alSourceRewind :: (source: u32) -> void --- - alSourceRewindv :: (n: i32, sources: ^u32) -> void --- - alSourceQueueBuffers :: (source: u32, n: i32, buffers: ^u32) -> void --- - alSourceUnqueueBuffers :: (source: u32, n: i32, buffers: ^u32) -> void --- - - alListenerf :: (param: i32, value: f32) -> void --- - alListener3f :: (param: i32, v1, v2, v3: f32) -> void --- - alListenerfv :: (param: i32, values: ^f32) -> void --- - alListeneri :: (param: i32, value: i32) -> void --- - alListener3i :: (param: i32, v1, v2, v3: i32) -> void --- - alListeneriv :: (param: i32, values: ^i32) -> void --- - alGetListenerf :: (param: i32, value: ^f32) -> void --- - alGetListener3f :: (param: i32, v1, v2, v3: ^f32) -> void --- - alGetListenerfv :: (param: i32, values: ^f32) -> void --- - alGetListeneri :: (param: i32, value: ^i32) -> void --- - alGetListener3i :: (param: i32, v1, v2, v3: ^i32) -> void --- - alGetListeneriv :: (param: i32, values: ^i32) -> void --- - - alEnable :: (capability: i32) -> void --- - alDisable :: (capability: i32) -> void --- - alIsEnabled :: (capability: i32) -> bool --- - alGetBoolean :: (param: i32) -> bool --- - alGetDouble :: (param: i32) -> f64 --- - alGetFloat :: (param: i32) -> f32 --- - alGetInteger :: (param: i32) -> i32 --- - alGetBooleanv :: (param: i32, data: ^bool) -> void --- - alGetDoublev :: (param: i32, data: ^f64) -> void --- - alGetFloatv :: (param: i32, data: ^f32) -> void --- - alGetIntegerv :: (param: i32, data: ^i32) -> void --- - alDistanceModel :: (value: i32) -> void --- - alDopplerFactor :: (value: f32) -> void --- - alSpeedOfSound :: (value: f32) -> void --- - - alGetError :: () -> i32 --- - - alcCreateContext :: (device: ALCdevice, attrlist: ^i32) -> ALCcontext --- - alcMakeContextCurrent :: (context: ALCcontext) -> bool --- - alcProcessContext :: (context: ALCcontext) -> void --- - alcSuspendContext :: (context: ALCcontext) -> void --- - alcDestroyContext :: (context: ALCcontext) -> void --- - alcGetCurrentContext :: () -> ALCcontext --- - alcGetContextsDevice :: (context: ALCcontext) -> ALCdevice --- - alcGetError :: (device: ALCdevice) -> i32 --- - - alcOpenDevice :: (name: cstr) -> ALCdevice --- - alcCloseDevice :: (device: ALCdevice) -> bool --- - - alcIsExtensionPresent :: (device: ALCdevice, extName: cstr) -> bool --- - alcGetProcAddress :: (device: ALCdevice, funcName: cstr) -> ALCextfunc --- - alcGetEnumValue :: (device: ALCdevice, enumName: cstr) -> i32 --- - alcGetIntegerv :: (device: ALCdevice, param: i32, size: i32, data: ^i32) -> void --- - - alcCaptureOpenDevice :: (name: cstr, freq: u32, format: i32, buffersize: i32) -> ALCdevice --- - alcCaptureCloseDevice :: (device: ALCdevice) -> bool --- - alcCaptureStart :: (device: ALCdevice) -> void --- - alcCaptureStop :: (device: ALCdevice) -> void --- - alcCaptureSamples :: (device: ALCdevice, buf: rawptr, samples: i32) -> void --- - - // This returns a C-allocated string, which is not supported at the moment. - alGetString :: (param: i32) -> cptr(u8) --- - alcGetString :: (device: ALCdevice, param: i32) -> cptr(u8) --- -} - -AL_FALSE :: 0 - -AL_TRUE :: 1 - - -/** - * Relative source. - * Type: ALboolean - * Range: [AL_TRUE, AL_FALSE] - * Default: AL_FALSE - * - * Specifies if the Source has relative coordinates. - */ -AL_SOURCE_RELATIVE :: 0x202 - - -/** - * Inner cone angle, in degrees. - * Type: ALint, ALfloat - * Range: [0 - 360] - * Default: 360 - * - * The angle covered by the inner cone, where the source will not attenuate. - */ -AL_CONE_INNER_ANGLE :: 0x1001 - -/** - * Outer cone angle, in degrees. - * Range: [0 - 360] - * Default: 360 - * - * The angle covered by the outer cone, where the source will be fully - * attenuated. - */ -AL_CONE_OUTER_ANGLE :: 0x1002 - -/** - * Source pitch. - * Type: ALfloat - * Range: [0.5 - 2.0] - * Default: 1.0 - * - * A multiplier for the frequency (sample rate) of the source's buffer. - */ -AL_PITCH :: 0x1003 - -/** - * Source or listener position. - * Type: ALfloat[3], ALint[3] - * Default: {0, 0, 0} - * - * The source or listener location in three dimensional space. - * - * OpenAL, like OpenGL, uses a right handed coordinate system, where in a - * frontal default view X (thumb) points right, Y points up (index finger), and - * Z points towards the viewer/camera (middle finger). - * - * To switch from a left handed coordinate system, flip the sign on the Z - * coordinate. - */ -AL_POSITION :: 0x1004 - -/** - * Source direction. - * Type: ALfloat[3], ALint[3] - * Default: {0, 0, 0} - * - * Specifies the current direction in local space. - * A zero-length vector specifies an omni-directional source (cone is ignored). - */ -AL_DIRECTION :: 0x1005 - -/** - * Source or listener velocity. - * Type: ALfloat[3], ALint[3] - * Default: {0, 0, 0} - * - * Specifies the current velocity in local space. - */ -AL_VELOCITY :: 0x1006 - -/** - * Source looping. - * Type: ALboolean - * Range: [AL_TRUE, AL_FALSE] - * Default: AL_FALSE - * - * Specifies whether source is looping. - */ -AL_LOOPING :: 0x1007 - -/** - * Source buffer. - * Type: ALuint - * Range: any valid Buffer. - * - * Specifies the buffer to provide sound samples. - */ -AL_BUFFER :: 0x1009 - -/** - * Source or listener gain. - * Type: ALfloat - * Range: [0.0 - ] - * - * A value of 1.0 means unattenuated. Each division by 2 equals an attenuation - * of about -6dB. Each multiplicaton by 2 equals an amplification of about - * +6dB. - * - * A value of 0.0 is meaningless with respect to a logarithmic scale; it is - * silent. - */ -AL_GAIN :: 0x100A - -/** - * Minimum source gain. - * Type: ALfloat - * Range: [0.0 - 1.0] - * - * The minimum gain allowed for a source, after distance and cone attenation is - * applied (if applicable). - */ -AL_MIN_GAIN :: 0x100D - -/** - * Maximum source gain. - * Type: ALfloat - * Range: [0.0 - 1.0] - * - * The maximum gain allowed for a source, after distance and cone attenation is - * applied (if applicable). - */ -AL_MAX_GAIN :: 0x100E - -/** - * Listener orientation. - * Type: ALfloat[6] - * Default: {0.0, 0.0, -1.0, 0.0, 1.0, 0.0} - * - * Effectively two three dimensional vectors. The first vector is the front (or - * "at") and the second is the top (or "up"). - * - * Both vectors are in local space. - */ -AL_ORIENTATION :: 0x100F - -/** - * Source state (query only). - * Type: ALint - * Range: [AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED] - */ -AL_SOURCE_STATE :: 0x1010 - -/** Source state value. */ -AL_INITIAL :: 0x1011 -AL_PLAYING :: 0x1012 -AL_PAUSED :: 0x1013 -AL_STOPPED :: 0x1014 - -/** - * Source Buffer Queue size (query only). - * Type: ALint - * - * The number of buffers queued using alSourceQueueBuffers, minus the buffers - * removed with alSourceUnqueueBuffers. - */ -AL_BUFFERS_QUEUED :: 0x1015 - -/** - * Source Buffer Queue processed count (query only). - * Type: ALint - * - * The number of queued buffers that have been fully processed, and can be - * removed with alSourceUnqueueBuffers. - * - * Looping sources will never fully process buffers because they will be set to - * play again for when the source loops. - */ -AL_BUFFERS_PROCESSED :: 0x1016 - -/** - * Source reference distance. - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - * - * The distance in units that no attenuation occurs. - * - * At 0.0, no distance attenuation ever occurs on non-linear attenuation models. - */ -AL_REFERENCE_DISTANCE :: 0x1020 - -/** - * Source rolloff factor. - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - * - * Multiplier to exaggerate or diminish distance attenuation. - * - * At 0.0, no distance attenuation ever occurs. - */ -AL_ROLLOFF_FACTOR :: 0x1021 - -/** - * Outer cone gain. - * Type: ALfloat - * Range: [0.0 - 1.0] - * Default: 0.0 - * - * The gain attenuation applied when the listener is outside of the source's - * outer cone. - */ -AL_CONE_OUTER_GAIN :: 0x1022 - -/** - * Source maximum distance. - * Type: ALfloat - * Range: [0.0 - ] - * Default: +inf - * - * The distance above which the source is not attenuated any further with a - * clamped distance model, or where attenuation reaches 0.0 gain for linear - * distance models with a default rolloff factor. - */ -AL_MAX_DISTANCE :: 0x1023 - -/** Source buffer position, in seconds */ -AL_SEC_OFFSET :: 0x1024 -/** Source buffer position, in sample frames */ -AL_SAMPLE_OFFSET :: 0x1025 -/** Source buffer position, in bytes */ -AL_BYTE_OFFSET :: 0x1026 - -/** - * Source type (query only). - * Type: ALint - * Range: [AL_STATIC, AL_STREAMING, AL_UNDETERMINED] - * - * A Source is Static if a Buffer has been attached using AL_BUFFER. - * - * A Source is Streaming if one or more Buffers have been attached using - * alSourceQueueBuffers. - * - * A Source is Undetermined when it has the NULL buffer attached using - * AL_BUFFER. - */ -AL_SOURCE_TYPE :: 0x1027 - -/** Source type value. */ -AL_STATIC :: 0x1028 -AL_STREAMING :: 0x1029 -AL_UNDETERMINED :: 0x1030 - -/** Buffer format specifier. */ -AL_FORMAT_MONO8 :: 0x1100 -AL_FORMAT_MONO16 :: 0x1101 -AL_FORMAT_STEREO8 :: 0x1102 -AL_FORMAT_STEREO16 :: 0x1103 - -/** Buffer frequency (query only). */ -AL_FREQUENCY :: 0x2001 -/** Buffer bits per sample (query only). */ -AL_BITS :: 0x2002 -/** Buffer channel count (query only). */ -AL_CHANNELS :: 0x2003 -/** Buffer data size (query only). */ -AL_SIZE :: 0x2004 - -/** - * Buffer state. - * - * Not for public use. - */ -AL_UNUSED :: 0x2010 -AL_PENDING :: 0x2011 -AL_PROCESSED :: 0x2012 - - -/** No error. */ -AL_NO_ERROR :: 0 - -/** Invalid name paramater passed to AL call. */ -AL_INVALID_NAME :: 0xA001 - -/** Invalid enum parameter passed to AL call. */ -AL_INVALID_ENUM :: 0xA002 - -/** Invalid value parameter passed to AL call. */ -AL_INVALID_VALUE :: 0xA003 - -/** Illegal AL call. */ -AL_INVALID_OPERATION :: 0xA004 - -/** Not enough memory. */ -AL_OUT_OF_MEMORY :: 0xA005 - - -/** Context string: Vendor ID. */ -AL_VENDOR :: 0xB001 -/** Context string: Version. */ -AL_VERSION :: 0xB002 -/** Context string: Renderer ID. */ -AL_RENDERER :: 0xB003 -/** Context string: Space-separated extension list. */ -AL_EXTENSIONS :: 0xB004 - - -/** - * Doppler scale. - * Type: ALfloat - * Range: [0.0 - ] - * Default: 1.0 - * - * Scale for source and listener velocities. - */ -AL_DOPPLER_FACTOR :: 0xC000 - -/** - * Doppler velocity (deprecated). - * - * A multiplier applied to the Speed of Sound. - */ -AL_DOPPLER_VELOCITY :: 0xC001 - -/** - * Speed of Sound, in units per second. - * Type: ALfloat - * Range: [0.0001 - ] - * Default: 343.3 - * - * The speed at which sound waves are assumed to travel, when calculating the - * doppler effect. - */ -AL_SPEED_OF_SOUND :: 0xC003 - -/** - * Distance attenuation model. - * Type: ALint - * Range: [AL_NONE, AL_INVERSE_DISTANCE, AL_INVERSE_DISTANCE_CLAMPED, - * AL_LINEAR_DISTANCE, AL_LINEAR_DISTANCE_CLAMPED, - * AL_EXPONENT_DISTANCE, AL_EXPONENT_DISTANCE_CLAMPED] - * Default: AL_INVERSE_DISTANCE_CLAMPED - * - * The model by which sources attenuate with distance. - * - * None - No distance attenuation. - * Inverse - Doubling the distance halves the source gain. - * Linear - Linear gain scaling between the reference and max distances. - * Exponent - Exponential gain dropoff. - * - * Clamped variations work like the non-clamped counterparts, except the - * distance calculated is clamped between the reference and max distances. - */ -AL_DISTANCE_MODEL :: 0xD000 - -/** Distance model value. */ -AL_INVERSE_DISTANCE :: 0xD001 -AL_INVERSE_DISTANCE_CLAMPED :: 0xD002 -AL_LINEAR_DISTANCE :: 0xD003 -AL_LINEAR_DISTANCE_CLAMPED :: 0xD004 -AL_EXPONENT_DISTANCE :: 0xD005 -AL_EXPONENT_DISTANCE_CLAMPED :: 0xD006 - - - -/** Context attribute: Hz. */ -ALC_FREQUENCY :: 0x1007 - -/** Context attribute: Hz. */ -ALC_REFRESH :: 0x1008 - -/** Context attribute: AL_TRUE or AL_FALSE. */ -ALC_SYNC :: 0x1009 - -/** Context attribute: requested Mono (3D) Sources. */ -ALC_MONO_SOURCES :: 0x1010 - -/** Context attribute: requested Stereo Sources. */ -ALC_STEREO_SOURCES :: 0x1011 - -/** No error. */ -ALC_NO_ERROR :: 0 - -/** Invalid device handle. */ -ALC_INVALID_DEVICE :: 0xA001 - -/** Invalid context handle. */ -ALC_INVALID_CONTEXT :: 0xA002 - -/** Invalid enum parameter passed to an ALC call. */ -ALC_INVALID_ENUM :: 0xA003 - -/** Invalid value parameter passed to an ALC call. */ -ALC_INVALID_VALUE :: 0xA004 - -/** Out of memory. */ -ALC_OUT_OF_MEMORY :: 0xA005 - - -/** Runtime ALC version. */ -ALC_MAJOR_VERSION :: 0x1000 -ALC_MINOR_VERSION :: 0x1001 - -/** Context attribute list properties. */ -ALC_ATTRIBUTES_SIZE :: 0x1002 -ALC_ALL_ATTRIBUTES :: 0x1003 - -/** String for the default device specifier. */ -ALC_DEFAULT_DEVICE_SPECIFIER :: 0x1004 -/** - * String for the given device's specifier. - * - * If device handle is NULL, it is instead a null-char separated list of - * strings of known device specifiers (list ends with an empty string). - */ -ALC_DEVICE_SPECIFIER :: 0x1005 -/** String for space-separated list of ALC extensions. */ -ALC_EXTENSIONS :: 0x1006 - - -/** Capture extension */ -ALC_EXT_CAPTURE :: 1 -/** - * String for the given capture device's specifier. - * - * If device handle is NULL, it is instead a null-char separated list of - * strings of known capture device specifiers (list ends with an empty string). - */ -ALC_CAPTURE_DEVICE_SPECIFIER :: 0x310 -/** String for the default capture device specifier. */ -ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER :: 0x311 -/** Number of sample frames available for capture. */ -ALC_CAPTURE_SAMPLES :: 0x312 - - -/** Enumerate All extension */ -ALC_ENUMERATE_ALL_EXT :: 1 -/** String for the default extended device specifier. */ -ALC_DEFAULT_ALL_DEVICES_SPECIFIER :: 0x1012 -/** - * String for the given extended device's specifier. - * - * If device handle is NULL, it is instead a null-char separated list of - * strings of known extended device specifiers (list ends with an empty string). - */ -ALC_ALL_DEVICES_SPECIFIER :: 0x1013 diff --git a/modules/openal/onyx_openal.c b/modules/openal/onyx_openal.c deleted file mode 100644 index 135f4b6e..00000000 --- a/modules/openal/onyx_openal.c +++ /dev/null @@ -1,552 +0,0 @@ -// -// THIS FILE WAS AUTOMATICALLY GENERATED. -// - -#include -#include - - -#define ONYX_LIBRARY_NAME onyx_openal -#include "onyx_library.h" - -#define P(i, k) (params->data[i].of.k) - -ONYX_DEF(alGenBuffers, (WASM_I32, WASM_I32), ()) { - alGenBuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alDeleteBuffers, (WASM_I32, WASM_I32), ()) { - alDeleteBuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alIsBuffer, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alIsBuffer(P(0, i32))); - return NULL; -} - -ONYX_DEF(alBufferData, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alBufferData(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(alBufferf, (WASM_I32, WASM_I32, WASM_F32), ()) { - alBufferf(P(0, i32), P(1, i32), P(2, f32)); - return NULL; -} - -ONYX_DEF(alBuffer3f, (WASM_I32, WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { - alBuffer3f(P(0, i32), P(1, i32), P(2, f32), P(3, f32), P(4, f32)); - return NULL; -} - -ONYX_DEF(alBufferfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alBufferi, (WASM_I32, WASM_I32, WASM_I32), ()) { - alBufferi(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(alBuffer3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alBuffer3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(alBufferiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetBufferf, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetBufferf(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetBuffer3f, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alGetBuffer3f(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(alGetBufferfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetBufferi, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetBufferi(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetBuffer3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alGetBuffer3i(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(alGetBufferiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGenSources, (WASM_I32, WASM_I32), ()) { - alGenSources(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alDeleteSources, (WASM_I32, WASM_I32), ()) { - alDeleteSources(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alIsSource, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alIsSource(P(0, i32))); - return NULL; -} - -ONYX_DEF(alSourcef, (WASM_I32, WASM_I32, WASM_F32), ()) { - alSourcef(P(0, i32), P(1, i32), P(2, f32)); - return NULL; -} - -ONYX_DEF(alSource3f, (WASM_I32, WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { - alSource3f(P(0, i32), P(1, i32), P(2, f32), P(3, f32), P(4, f32)); - return NULL; -} - -ONYX_DEF(alSourcefv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alSourcefv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alSourcei, (WASM_I32, WASM_I32, WASM_I32), ()) { - alSourcei(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(alSource3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alSource3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(alSourceiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alSourceiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetSourcef, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetSourcef(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetSource3f, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alGetSource3f(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(alGetSourcefv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetSourcefv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetSourcei, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetSourcei(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alGetSource3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alGetSource3i(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(alGetSourceiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - alGetSourceiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alSourcePlay, (WASM_I32), ()) { - alSourcePlay(P(0, i32)); - return NULL; -} - -ONYX_DEF(alSourcePlayv, (WASM_I32, WASM_I32), ()) { - alSourcePlayv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alSourcePause, (WASM_I32), ()) { - alSourcePause(P(0, i32)); - return NULL; -} - -ONYX_DEF(alSourcePausev, (WASM_I32, WASM_I32), ()) { - alSourcePausev(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alSourceStop, (WASM_I32), ()) { - alSourceStop(P(0, i32)); - return NULL; -} - -ONYX_DEF(alSourceStopv, (WASM_I32, WASM_I32), ()) { - alSourceStopv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alSourceRewind, (WASM_I32), ()) { - alSourceRewind(P(0, i32)); - return NULL; -} - -ONYX_DEF(alSourceRewindv, (WASM_I32, WASM_I32), ()) { - alSourceRewindv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alSourceQueueBuffers, (WASM_I32, WASM_I32, WASM_I32), ()) { - alSourceQueueBuffers(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alSourceUnqueueBuffers, (WASM_I32, WASM_I32, WASM_I32), ()) { - alSourceUnqueueBuffers(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(alListenerf, (WASM_I32, WASM_F32), ()) { - alListenerf(P(0, i32), P(1, f32)); - return NULL; -} - -ONYX_DEF(alListener3f, (WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { - alListener3f(P(0, i32), P(1, f32), P(2, f32), P(3, f32)); - return NULL; -} - -ONYX_DEF(alListenerfv, (WASM_I32, WASM_I32), ()) { - alListenerfv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alListeneri, (WASM_I32, WASM_I32), ()) { - alListeneri(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(alListener3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alListener3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(alListeneriv, (WASM_I32, WASM_I32), ()) { - alListeneriv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetListenerf, (WASM_I32, WASM_I32), ()) { - alGetListenerf(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetListener3f, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alGetListener3f(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(alGetListenerfv, (WASM_I32, WASM_I32), ()) { - alGetListenerfv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetListeneri, (WASM_I32, WASM_I32), ()) { - alGetListeneri(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetListener3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - alGetListener3i(P(0, i32), ONYX_PTR(P(1, i32)), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(alGetListeneriv, (WASM_I32, WASM_I32), ()) { - alGetListeneriv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alEnable, (WASM_I32), ()) { - alEnable(P(0, i32)); - return NULL; -} - -ONYX_DEF(alDisable, (WASM_I32), ()) { - alDisable(P(0, i32)); - return NULL; -} - -ONYX_DEF(alIsEnabled, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alIsEnabled(P(0, i32))); - return NULL; -} - -ONYX_DEF(alGetBoolean, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alGetBoolean(P(0, i32))); - return NULL; -} - -ONYX_DEF(alGetDouble, (WASM_I32), (WASM_F64)) { - results->data[0] = WASM_F64_VAL(alGetDouble(P(0, i32))); - return NULL; -} - -ONYX_DEF(alGetFloat, (WASM_I32), (WASM_F32)) { - results->data[0] = WASM_F32_VAL(alGetFloat(P(0, i32))); - return NULL; -} - -ONYX_DEF(alGetInteger, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alGetInteger(P(0, i32))); - return NULL; -} - -ONYX_DEF(alGetBooleanv, (WASM_I32, WASM_I32), ()) { - alGetBooleanv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetDoublev, (WASM_I32, WASM_I32), ()) { - alGetDoublev(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetFloatv, (WASM_I32, WASM_I32), ()) { - alGetFloatv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alGetIntegerv, (WASM_I32, WASM_I32), ()) { - alGetIntegerv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(alDistanceModel, (WASM_I32), ()) { - alDistanceModel(P(0, i32)); - return NULL; -} - -ONYX_DEF(alDopplerFactor, (WASM_F32), ()) { - alDopplerFactor(P(0, f32)); - return NULL; -} - -ONYX_DEF(alSpeedOfSound, (WASM_F32), ()) { - alSpeedOfSound(P(0, f32)); - return NULL; -} - -ONYX_DEF(alGetError, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alGetError()); - return NULL; -} - -ONYX_DEF(alcCreateContext, (WASM_I64, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcCreateContext((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(alcMakeContextCurrent, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alcMakeContextCurrent((ALCcontext *) P(0, i64))); - return NULL; -} - -ONYX_DEF(alcProcessContext, (WASM_I64), ()) { - alcProcessContext((ALCcontext *) P(0, i64)); - return NULL; -} - -ONYX_DEF(alcSuspendContext, (WASM_I64), ()) { - alcSuspendContext((ALCcontext *) P(0, i64)); - return NULL; -} - -ONYX_DEF(alcDestroyContext, (WASM_I64), ()) { - alcDestroyContext((ALCcontext *) P(0, i64)); - return NULL; -} - -ONYX_DEF(alcGetCurrentContext, (), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcGetCurrentContext()); - return NULL; -} - -ONYX_DEF(alcGetContextsDevice, (WASM_I64), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcGetContextsDevice((ALCcontext *) P(0, i64))); - return NULL; -} - -ONYX_DEF(alcGetError, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alcGetError((ALCdevice *) P(0, i64))); - return NULL; -} - -ONYX_DEF(alcOpenDevice, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcOpenDevice(ONYX_PTR(P(0, i32)))); - return NULL; -} - -ONYX_DEF(alcCloseDevice, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alcCloseDevice((ALCdevice *) P(0, i64))); - return NULL; -} - -ONYX_DEF(alcIsExtensionPresent, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alcIsExtensionPresent((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(alcGetProcAddress, (WASM_I64, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcGetProcAddress((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(alcGetEnumValue, (WASM_I64, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alcGetEnumValue((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(alcGetIntegerv, (WASM_I64, WASM_I32, WASM_I32, WASM_I32), ()) { - alcGetIntegerv((ALCdevice *) P(0, i64), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(alcCaptureOpenDevice, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcCaptureOpenDevice(ONYX_PTR(P(0, i32)), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(alcCaptureCloseDevice, (WASM_I64), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(alcCaptureCloseDevice((ALCdevice *) P(0, i64))); - return NULL; -} - -ONYX_DEF(alcCaptureStart, (WASM_I64), ()) { - alcCaptureStart((ALCdevice *) P(0, i64)); - return NULL; -} - -ONYX_DEF(alcCaptureStop, (WASM_I64), ()) { - alcCaptureStop((ALCdevice *) P(0, i64)); - return NULL; -} - -ONYX_DEF(alcCaptureSamples, (WASM_I64, WASM_I32, WASM_I32), ()) { - alcCaptureSamples((ALCdevice *) P(0, i64), ONYX_PTR(P(1, i32)), P(2, i32)); - return NULL; -} - -ONYX_DEF(alGetString, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alGetString(P(0, i32))); - return NULL; -} - -ONYX_DEF(alcGetString, (WASM_I64, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(alcGetString((ALCdevice *) P(0, i64), P(1, i32))); - return NULL; -} - - - -ONYX_LIBRARY { - ONYX_FUNC(alGenBuffers) - ONYX_FUNC(alDeleteBuffers) - ONYX_FUNC(alIsBuffer) - ONYX_FUNC(alBufferData) - ONYX_FUNC(alBufferf) - ONYX_FUNC(alBuffer3f) - ONYX_FUNC(alBufferfv) - ONYX_FUNC(alBufferi) - ONYX_FUNC(alBuffer3i) - ONYX_FUNC(alBufferiv) - ONYX_FUNC(alGetBufferf) - ONYX_FUNC(alGetBuffer3f) - ONYX_FUNC(alGetBufferfv) - ONYX_FUNC(alGetBufferi) - ONYX_FUNC(alGetBuffer3i) - ONYX_FUNC(alGetBufferiv) - ONYX_FUNC(alGenSources) - ONYX_FUNC(alDeleteSources) - ONYX_FUNC(alIsSource) - ONYX_FUNC(alSourcef) - ONYX_FUNC(alSource3f) - ONYX_FUNC(alSourcefv) - ONYX_FUNC(alSourcei) - ONYX_FUNC(alSource3i) - ONYX_FUNC(alSourceiv) - ONYX_FUNC(alGetSourcef) - ONYX_FUNC(alGetSource3f) - ONYX_FUNC(alGetSourcefv) - ONYX_FUNC(alGetSourcei) - ONYX_FUNC(alGetSource3i) - ONYX_FUNC(alGetSourceiv) - ONYX_FUNC(alSourcePlay) - ONYX_FUNC(alSourcePlayv) - ONYX_FUNC(alSourcePause) - ONYX_FUNC(alSourcePausev) - ONYX_FUNC(alSourceStop) - ONYX_FUNC(alSourceStopv) - ONYX_FUNC(alSourceRewind) - ONYX_FUNC(alSourceRewindv) - ONYX_FUNC(alSourceQueueBuffers) - ONYX_FUNC(alSourceUnqueueBuffers) - ONYX_FUNC(alListenerf) - ONYX_FUNC(alListener3f) - ONYX_FUNC(alListenerfv) - ONYX_FUNC(alListeneri) - ONYX_FUNC(alListener3i) - ONYX_FUNC(alListeneriv) - ONYX_FUNC(alGetListenerf) - ONYX_FUNC(alGetListener3f) - ONYX_FUNC(alGetListenerfv) - ONYX_FUNC(alGetListeneri) - ONYX_FUNC(alGetListener3i) - ONYX_FUNC(alGetListeneriv) - ONYX_FUNC(alEnable) - ONYX_FUNC(alDisable) - ONYX_FUNC(alIsEnabled) - ONYX_FUNC(alGetBoolean) - ONYX_FUNC(alGetDouble) - ONYX_FUNC(alGetFloat) - ONYX_FUNC(alGetInteger) - ONYX_FUNC(alGetBooleanv) - ONYX_FUNC(alGetDoublev) - ONYX_FUNC(alGetFloatv) - ONYX_FUNC(alGetIntegerv) - ONYX_FUNC(alDistanceModel) - ONYX_FUNC(alDopplerFactor) - ONYX_FUNC(alSpeedOfSound) - ONYX_FUNC(alGetError) - ONYX_FUNC(alcCreateContext) - ONYX_FUNC(alcMakeContextCurrent) - ONYX_FUNC(alcProcessContext) - ONYX_FUNC(alcSuspendContext) - ONYX_FUNC(alcDestroyContext) - ONYX_FUNC(alcGetCurrentContext) - ONYX_FUNC(alcGetContextsDevice) - ONYX_FUNC(alcGetError) - ONYX_FUNC(alcOpenDevice) - ONYX_FUNC(alcCloseDevice) - ONYX_FUNC(alcIsExtensionPresent) - ONYX_FUNC(alcGetProcAddress) - ONYX_FUNC(alcGetEnumValue) - ONYX_FUNC(alcGetIntegerv) - ONYX_FUNC(alcCaptureOpenDevice) - ONYX_FUNC(alcCaptureCloseDevice) - ONYX_FUNC(alcCaptureStart) - ONYX_FUNC(alcCaptureStop) - ONYX_FUNC(alcCaptureSamples) - ONYX_FUNC(alGetString) - ONYX_FUNC(alcGetString) - NULL -}; \ No newline at end of file diff --git a/modules/openal/onyx_openal.so b/modules/openal/onyx_openal.so deleted file mode 100755 index d853604d..00000000 Binary files a/modules/openal/onyx_openal.so and /dev/null differ diff --git a/modules/opengles/build.bat b/modules/opengles/build.bat deleted file mode 100644 index d1a8d4fd..00000000 --- a/modules/opengles/build.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off - -call "tools\dev.bat" - -cl /MT /std:c17 /TC /I include /I lib/common/include /IC:\dev\heartbreak\lib\common\include /D_USRDLL /D_WINDLL modules\opengles\opengles.c /link opengl32.lib ws2_32.lib Advapi32.lib userenv.lib bcrypt.lib libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib /DLL /OUT:onyx_opengles.dll - -del onyx_opengles.obj -del onyx_opengles.lib -del onyx_opengles.exp \ No newline at end of file diff --git a/modules/opengles/build.onyx b/modules/opengles/build.onyx deleted file mode 100644 index 39d26b5d..00000000 --- a/modules/opengles/build.onyx +++ /dev/null @@ -1,54 +0,0 @@ -#load "core/std" -#load "scripts/c_binding" -#load "scripts/c_library" -#load "./module" - -use package core -use package c_binding - -main :: () { - path := module_path(#file); - - c_file_path := string.concat(path, "opengles.c"); - - result := build_c_binding(.{ - output_file = c_file_path, - foreign_block = (package opengles).foreign_block, - - cast_map = .[], - name_map = ((name) => aprintf("glad_{}", name)), - - preamble = .[ -""" -#define GLAD_GLES2_IMPLEMENTATION -#include "glad.h" -""" - ], - - custom_implementations = .[ - .{ "glInit", - """ -ONYX_DEF(glInit, (LONG), ()) { - GLADloadfunc load_sym = (GLADloadfunc) params->data[0].of.i64; - gladLoadGLES2(load_sym); - return NULL; -} - """} - ], - }); - - if !result { - println("Failed to make opengles.c"); - os.exit(1); - } else { - println("Successfully made opengles.c"); - } - - result = compile_c_file(c_file_path, string.concat(path, "onyx_opengles.so")); - if !result { - println("Failed compile opengles.c"); - os.exit(1); - } else { - println("Successfully made onyx_opengles.so"); - } -} diff --git a/modules/opengles/glad.h b/modules/opengles/glad.h deleted file mode 100644 index 6d04fd93..00000000 --- a/modules/opengles/glad.h +++ /dev/null @@ -1,2664 +0,0 @@ -// While this header was originally generated using the method below, -// it has been modified to delete the #define gl... glad_gl... statements -// from below. They were causing unintended name conversions in onyx_opengles.c, -// and it was easier to just remove them from this propriatery file than -// re-write the entire source file. - -/** - * Loader generated by glad 2.0.0-beta on Thu Nov 18 00:03:21 2021 - * - * Generator: C/C++ - * Specification: gl - * Extensions: 0 - * - * APIs: - * - gles2=3.0 - * - * Options: - * - ALIAS = False - * - DEBUG = False - * - HEADER_ONLY = True - * - LOADER = False - * - MX = False - * - MX_GLOBAL = False - * - ON_DEMAND = False - * - * Commandline: - * --api='gles2=3.0' --extensions='' c --header-only - * - * Online: - * http://glad.sh/#api=gles2%3D3.0&extensions=&generator=c&options=HEADER_ONLY - * - */ - -#ifndef GLAD_GLES2_H_ -#define GLAD_GLES2_H_ - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-id-macro" -#endif -#ifdef __gl2_h_ - #error OpenGL ES 2 header already included (API: gles2), remove previous include! -#endif -#define __gl2_h_ 1 -#ifdef __gl3_h_ - #error OpenGL ES 3 header already included (API: gles2), remove previous include! -#endif -#define __gl3_h_ 1 -#ifdef __clang__ -#pragma clang diagnostic pop -#endif - -#define GLAD_GLES2 -#define GLAD_OPTION_GLES2_HEADER_ONLY - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef GLAD_PLATFORM_H_ -#define GLAD_PLATFORM_H_ - -#ifndef GLAD_PLATFORM_WIN32 - #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) - #define GLAD_PLATFORM_WIN32 1 - #else - #define GLAD_PLATFORM_WIN32 0 - #endif -#endif - -#ifndef GLAD_PLATFORM_APPLE - #ifdef __APPLE__ - #define GLAD_PLATFORM_APPLE 1 - #else - #define GLAD_PLATFORM_APPLE 0 - #endif -#endif - -#ifndef GLAD_PLATFORM_EMSCRIPTEN - #ifdef __EMSCRIPTEN__ - #define GLAD_PLATFORM_EMSCRIPTEN 1 - #else - #define GLAD_PLATFORM_EMSCRIPTEN 0 - #endif -#endif - -#ifndef GLAD_PLATFORM_UWP - #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) - #ifdef __has_include - #if __has_include() - #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 - #endif - #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ - #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 - #endif - #endif - - #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY - #include - #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) - #define GLAD_PLATFORM_UWP 1 - #endif - #endif - - #ifndef GLAD_PLATFORM_UWP - #define GLAD_PLATFORM_UWP 0 - #endif -#endif - -#ifdef __GNUC__ - #define GLAD_GNUC_EXTENSION __extension__ -#else - #define GLAD_GNUC_EXTENSION -#endif - -#ifndef GLAD_API_CALL - #if defined(GLAD_API_CALL_EXPORT) - #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) - #if defined(GLAD_API_CALL_EXPORT_BUILD) - #if defined(__GNUC__) - #define GLAD_API_CALL __attribute__ ((dllexport)) extern - #else - #define GLAD_API_CALL __declspec(dllexport) extern - #endif - #else - #if defined(__GNUC__) - #define GLAD_API_CALL __attribute__ ((dllimport)) extern - #else - #define GLAD_API_CALL __declspec(dllimport) extern - #endif - #endif - #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) - #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern - #else - #define GLAD_API_CALL extern - #endif - #else - #define GLAD_API_CALL extern - #endif -#endif - -#ifdef APIENTRY - #define GLAD_API_PTR APIENTRY -#elif GLAD_PLATFORM_WIN32 - #define GLAD_API_PTR __stdcall -#else - #define GLAD_API_PTR -#endif - -#ifndef GLAPI -#define GLAPI GLAD_API_CALL -#endif - -#ifndef GLAPIENTRY -#define GLAPIENTRY GLAD_API_PTR -#endif - -#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) -#define GLAD_VERSION_MAJOR(version) (version / 10000) -#define GLAD_VERSION_MINOR(version) (version % 10000) - -#define GLAD_GENERATOR_VERSION "2.0.0-beta" - -typedef void (*GLADapiproc)(void); - -typedef GLADapiproc (*GLADloadfunc)(const char *name); -typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); - -typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); -typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); - -#endif /* GLAD_PLATFORM_H_ */ - -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_ACTIVE_TEXTURE 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_ALIASED_LINE_WIDTH_RANGE 0x846E -#define GL_ALIASED_POINT_SIZE_RANGE 0x846D -#define GL_ALPHA 0x1906 -#define GL_ALPHA_BITS 0x0D55 -#define GL_ALREADY_SIGNALED 0x911A -#define GL_ALWAYS 0x0207 -#define GL_ANY_SAMPLES_PASSED 0x8C2F -#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A -#define GL_ARRAY_BUFFER 0x8892 -#define GL_ARRAY_BUFFER_BINDING 0x8894 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_BACK 0x0405 -#define GL_BLEND 0x0BE2 -#define GL_BLEND_COLOR 0x8005 -#define GL_BLEND_DST_ALPHA 0x80CA -#define GL_BLEND_DST_RGB 0x80C8 -#define GL_BLEND_EQUATION 0x8009 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_BLEND_EQUATION_RGB 0x8009 -#define GL_BLEND_SRC_ALPHA 0x80CB -#define GL_BLEND_SRC_RGB 0x80C9 -#define GL_BLUE 0x1905 -#define GL_BLUE_BITS 0x0D54 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_BUFFER_ACCESS_FLAGS 0x911F -#define GL_BUFFER_MAPPED 0x88BC -#define GL_BUFFER_MAP_LENGTH 0x9120 -#define GL_BUFFER_MAP_OFFSET 0x9121 -#define GL_BUFFER_MAP_POINTER 0x88BD -#define GL_BUFFER_SIZE 0x8764 -#define GL_BUFFER_USAGE 0x8765 -#define GL_BYTE 0x1400 -#define GL_CCW 0x0901 -#define GL_CLAMP_TO_EDGE 0x812F -#define GL_COLOR 0x1800 -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_COLOR_ATTACHMENT16 0x8CF0 -#define GL_COLOR_ATTACHMENT17 0x8CF1 -#define GL_COLOR_ATTACHMENT18 0x8CF2 -#define GL_COLOR_ATTACHMENT19 0x8CF3 -#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_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT30 0x8CFE -#define GL_COLOR_ATTACHMENT31 0x8CFF -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_COMPARE_REF_TO_TEXTURE 0x884E -#define GL_COMPARE_R_TO_TEXTURE 0x884E -#define GL_COMPILE_STATUS 0x8B81 -#define GL_COMPRESSED_R11_EAC 0x9270 -#define GL_COMPRESSED_RG11_EAC 0x9272 -#define GL_COMPRESSED_RGB8_ETC2 0x9274 -#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 -#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 -#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 -#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 -#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_TEXTURE_FORMATS 0x86A3 -#define GL_CONDITION_SATISFIED 0x911C -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_CONSTANT_COLOR 0x8001 -#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_PROGRAM 0x8B8D -#define GL_CURRENT_QUERY 0x8865 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_CW 0x0900 -#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_DEPTH32F_STENCIL8 0x8CAD -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_DEPTH_BITS 0x0D56 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_DEPTH_COMPONENT16 0x81A5 -#define GL_DEPTH_COMPONENT24 0x81A6 -#define GL_DEPTH_COMPONENT32F 0x8CAC -#define GL_DEPTH_FUNC 0x0B74 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_STENCIL 0x84F9 -#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DITHER 0x0BD0 -#define GL_DONT_CARE 0x1100 -#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_DST_ALPHA 0x0304 -#define GL_DST_COLOR 0x0306 -#define GL_DYNAMIC_COPY 0x88EA -#define GL_DYNAMIC_DRAW 0x88E8 -#define GL_DYNAMIC_READ 0x88E9 -#define GL_ELEMENT_ARRAY_BUFFER 0x8893 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 -#define GL_EQUAL 0x0202 -#define GL_EXTENSIONS 0x1F03 -#define GL_FALSE 0 -#define GL_FASTEST 0x1101 -#define GL_FIXED 0x140C -#define GL_FLOAT 0x1406 -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT2x3 0x8B65 -#define GL_FLOAT_MAT2x4 0x8B66 -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT3x2 0x8B67 -#define GL_FLOAT_MAT3x4 0x8B68 -#define GL_FLOAT_MAT4 0x8B5C -#define GL_FLOAT_MAT4x2 0x8B69 -#define GL_FLOAT_MAT4x3 0x8B6A -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_FRAMEBUFFER 0x8D40 -#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 -#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 -#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 -#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_OBJECT_NAME 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 -#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 -#define GL_FRAMEBUFFER_BINDING 0x8CA6 -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_DEFAULT 0x8218 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 -#define GL_FRAMEBUFFER_UNDEFINED 0x8219 -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD -#define GL_FRONT 0x0404 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_FRONT_FACE 0x0B46 -#define GL_FUNC_ADD 0x8006 -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_FUNC_SUBTRACT 0x800A -#define GL_GENERATE_MIPMAP_HINT 0x8192 -#define GL_GEQUAL 0x0206 -#define GL_GREATER 0x0204 -#define GL_GREEN 0x1904 -#define GL_GREEN_BITS 0x0D53 -#define GL_HALF_FLOAT 0x140B -#define GL_HIGH_FLOAT 0x8DF2 -#define GL_HIGH_INT 0x8DF5 -#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_INFO_LOG_LENGTH 0x8B84 -#define GL_INT 0x1404 -#define GL_INTERLEAVED_ATTRIBS 0x8C8C -#define GL_INT_2_10_10_10_REV 0x8D9F -#define GL_INT_SAMPLER_2D 0x8DCA -#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF -#define GL_INT_SAMPLER_3D 0x8DCB -#define GL_INT_SAMPLER_CUBE 0x8DCC -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 -#define GL_INVALID_INDEX 0xFFFFFFFF -#define GL_INVALID_OPERATION 0x0502 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVERT 0x150A -#define GL_KEEP 0x1E00 -#define GL_LEQUAL 0x0203 -#define GL_LESS 0x0201 -#define GL_LINEAR 0x2601 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINK_STATUS 0x8B82 -#define GL_LOW_FLOAT 0x8DF0 -#define GL_LOW_INT 0x8DF3 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A -#define GL_MAJOR_VERSION 0x821B -#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 -#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 -#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 -#define GL_MAP_READ_BIT 0x0001 -#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 -#define GL_MAP_WRITE_BIT 0x0002 -#define GL_MAX 0x8008 -#define GL_MAX_3D_TEXTURE_SIZE 0x8073 -#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF -#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF -#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E -#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_MAX_ELEMENTS_INDICES 0x80E9 -#define GL_MAX_ELEMENTS_VERTICES 0x80E8 -#define GL_MAX_ELEMENT_INDEX 0x8D6B -#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 -#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD -#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 -#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 -#define GL_MAX_SAMPLES 0x8D57 -#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#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_VARYING_COMPONENTS 0x8B4B -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VARYING_VECTORS 0x8DFC -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MEDIUM_FLOAT 0x8DF1 -#define GL_MEDIUM_INT 0x8DF4 -#define GL_MIN 0x8007 -#define GL_MINOR_VERSION 0x821C -#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 -#define GL_MIRRORED_REPEAT 0x8370 -#define GL_NEAREST 0x2600 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_NEVER 0x0200 -#define GL_NICEST 0x1102 -#define GL_NONE 0 -#define GL_NOTEQUAL 0x0205 -#define GL_NO_ERROR 0 -#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_OBJECT_TYPE 0x9112 -#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_SRC_ALPHA 0x0303 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_OUT_OF_MEMORY 0x0505 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_SKIP_ROWS 0x0D03 -#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_POINTS 0x0000 -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_FILL 0x8037 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 -#define GL_PROGRAM_BINARY_FORMATS 0x87FF -#define GL_PROGRAM_BINARY_LENGTH 0x8741 -#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 -#define GL_QUERY_RESULT 0x8866 -#define GL_QUERY_RESULT_AVAILABLE 0x8867 -#define GL_R11F_G11F_B10F 0x8C3A -#define GL_R16F 0x822D -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32F 0x822E -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#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_RED 0x1903 -#define GL_RED_BITS 0x0D52 -#define GL_RED_INTEGER 0x8D94 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 -#define GL_RENDERBUFFER_BINDING 0x8CA7 -#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 -#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 -#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE 0x8D50 -#define GL_RENDERBUFFER_SAMPLES 0x8CAB -#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERER 0x1F01 -#define GL_REPEAT 0x2901 -#define GL_REPLACE 0x1E01 -#define GL_RG 0x8227 -#define GL_RG16F 0x822F -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#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_A2 0x8059 -#define GL_RGB10_A2UI 0x906F -#define GL_RGB16F 0x881B -#define GL_RGB16I 0x8D89 -#define GL_RGB16UI 0x8D77 -#define GL_RGB32F 0x8815 -#define GL_RGB32I 0x8D83 -#define GL_RGB32UI 0x8D71 -#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_RGBA16F 0x881A -#define GL_RGBA16I 0x8D88 -#define GL_RGBA16UI 0x8D76 -#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_RGB_INTEGER 0x8D98 -#define GL_RG_INTEGER 0x8228 -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_2D_ARRAY 0x8DC1 -#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_BINDING 0x8919 -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 -#define GL_SAMPLES 0x80A9 -#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E -#define GL_SAMPLE_BUFFERS 0x80A8 -#define GL_SAMPLE_COVERAGE 0x80A0 -#define GL_SAMPLE_COVERAGE_INVERT 0x80AB -#define GL_SAMPLE_COVERAGE_VALUE 0x80AA -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_SEPARATE_ATTRIBS 0x8C8D -#define GL_SHADER_BINARY_FORMATS 0x8DF8 -#define GL_SHADER_COMPILER 0x8DFA -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_SHADER_TYPE 0x8B4F -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_SHORT 0x1402 -#define GL_SIGNALED 0x9119 -#define GL_SIGNED_NORMALIZED 0x8F9C -#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_STATIC_COPY 0x88E6 -#define GL_STATIC_DRAW 0x88E4 -#define GL_STATIC_READ 0x88E5 -#define GL_STENCIL 0x1802 -#define GL_STENCIL_ATTACHMENT 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_FAIL 0x0B94 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_INDEX8 0x8D48 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_STREAM_COPY 0x88E2 -#define GL_STREAM_DRAW 0x88E0 -#define GL_STREAM_READ 0x88E1 -#define GL_SUBPIXEL_BITS 0x0D50 -#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_TEXTURE 0x1702 -#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_2D 0x0DE1 -#define GL_TEXTURE_2D_ARRAY 0x8C1A -#define GL_TEXTURE_3D 0x806F -#define GL_TEXTURE_BASE_LEVEL 0x813C -#define GL_TEXTURE_BINDING_2D 0x8069 -#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D -#define GL_TEXTURE_BINDING_3D 0x806A -#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 -#define GL_TEXTURE_COMPARE_FUNC 0x884D -#define GL_TEXTURE_COMPARE_MODE 0x884C -#define GL_TEXTURE_CUBE_MAP 0x8513 -#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_IMMUTABLE_FORMAT 0x912F -#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF -#define GL_TEXTURE_MAG_FILTER 0x2800 -#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_SWIZZLE_A 0x8E45 -#define GL_TEXTURE_SWIZZLE_B 0x8E44 -#define GL_TEXTURE_SWIZZLE_G 0x8E43 -#define GL_TEXTURE_SWIZZLE_R 0x8E42 -#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_TRANSFORM_FEEDBACK 0x8E22 -#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 -#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_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_PAUSED 0x8E23 -#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 -#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 -#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRUE 1 -#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C -#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_FRAGMENT_SHADER 0x8A46 -#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_UNPACK_ALIGNMENT 0x0CF5 -#define GL_UNPACK_IMAGE_HEIGHT 0x806E -#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_UNSIGNALED 0x9118 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_UNSIGNED_INT 0x1405 -#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B -#define GL_UNSIGNED_INT_24_8 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_SAMPLER_2D 0x8DD2 -#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 -#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 -#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 -#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_4_4_4_4 0x8033 -#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 -#define GL_UNSIGNED_SHORT_5_6_5 0x8363 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_VENDOR 0x1F00 -#define GL_VERSION 0x1F02 -#define GL_VERTEX_ARRAY_BINDING 0x85B5 -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F -#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_VIEWPORT 0x0BA2 -#define GL_WAIT_FAILED 0x911D -#define GL_ZERO 0 - - -#ifndef __khrplatform_h_ -#define __khrplatform_h_ - -/* -** Copyright (c) 2008-2018 The Khronos Group Inc. -** -** Permission is hereby granted, free of charge, to any person obtaining a -** copy of this software and/or associated documentation files (the -** "Materials"), to deal in the Materials without restriction, including -** without limitation the rights to use, copy, modify, merge, publish, -** distribute, sublicense, and/or sell copies of the Materials, and to -** permit persons to whom the Materials are 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 Materials. -** -** THE MATERIALS ARE 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 -** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. -*/ - -/* Khronos platform-specific types and definitions. - * - * The master copy of khrplatform.h is maintained in the Khronos EGL - * Registry repository at https://github.com/KhronosGroup/EGL-Registry - * The last semantic modification to khrplatform.h was at commit ID: - * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 - * - * Adopters may modify this file to suit their platform. Adopters are - * encouraged to submit platform specific modifications to the Khronos - * group so that they can be included in future versions of this file. - * Please submit changes by filing pull requests or issues on - * the EGL Registry repository linked above. - * - * - * See the Implementer's Guidelines for information about where this file - * should be located on your system and for more details of its use: - * http://www.khronos.org/registry/implementers_guide.pdf - * - * This file should be included as - * #include - * by Khronos client API header files that use its types and defines. - * - * The types in khrplatform.h should only be used to define API-specific types. - * - * Types defined in khrplatform.h: - * khronos_int8_t signed 8 bit - * khronos_uint8_t unsigned 8 bit - * khronos_int16_t signed 16 bit - * khronos_uint16_t unsigned 16 bit - * khronos_int32_t signed 32 bit - * khronos_uint32_t unsigned 32 bit - * khronos_int64_t signed 64 bit - * khronos_uint64_t unsigned 64 bit - * khronos_intptr_t signed same number of bits as a pointer - * khronos_uintptr_t unsigned same number of bits as a pointer - * khronos_ssize_t signed size - * khronos_usize_t unsigned size - * khronos_float_t signed 32 bit floating point - * khronos_time_ns_t unsigned 64 bit time in nanoseconds - * khronos_utime_nanoseconds_t unsigned time interval or absolute time in - * nanoseconds - * khronos_stime_nanoseconds_t signed time interval in nanoseconds - * khronos_boolean_enum_t enumerated boolean type. This should - * only be used as a base type when a client API's boolean type is - * an enum. Client APIs which use an integer or other type for - * booleans cannot use this as the base type for their boolean. - * - * Tokens defined in khrplatform.h: - * - * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. - * - * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. - * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. - * - * Calling convention macros defined in this file: - * KHRONOS_APICALL - * KHRONOS_GLAD_API_PTR - * KHRONOS_APIATTRIBUTES - * - * These may be used in function prototypes as: - * - * KHRONOS_APICALL void KHRONOS_GLAD_API_PTR funcname( - * int arg1, - * int arg2) KHRONOS_APIATTRIBUTES; - */ - -#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) -# define KHRONOS_STATIC 1 -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APICALL - *------------------------------------------------------------------------- - * This precedes the return type of the function in the function prototype. - */ -#if defined(KHRONOS_STATIC) - /* If the preprocessor constant KHRONOS_STATIC is defined, make the - * header compatible with static linking. */ -# define KHRONOS_APICALL -#elif defined(_WIN32) -# define KHRONOS_APICALL __declspec(dllimport) -#elif defined (__SYMBIAN32__) -# define KHRONOS_APICALL IMPORT_C -#elif defined(__ANDROID__) -# define KHRONOS_APICALL __attribute__((visibility("default"))) -#else -# define KHRONOS_APICALL -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_GLAD_API_PTR - *------------------------------------------------------------------------- - * This follows the return type of the function and precedes the function - * name in the function prototype. - */ -#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) - /* Win32 but not WinCE */ -# define KHRONOS_GLAD_API_PTR __stdcall -#else -# define KHRONOS_GLAD_API_PTR -#endif - -/*------------------------------------------------------------------------- - * Definition of KHRONOS_APIATTRIBUTES - *------------------------------------------------------------------------- - * This follows the closing parenthesis of the function prototype arguments. - */ -#if defined (__ARMCC_2__) -#define KHRONOS_APIATTRIBUTES __softfp -#else -#define KHRONOS_APIATTRIBUTES -#endif - -/*------------------------------------------------------------------------- - * basic type definitions - *-----------------------------------------------------------------------*/ -#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) - - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__VMS ) || defined(__sgi) - -/* - * Using - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) - -/* - * Win32 - */ -typedef __int32 khronos_int32_t; -typedef unsigned __int32 khronos_uint32_t; -typedef __int64 khronos_int64_t; -typedef unsigned __int64 khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif defined(__sun__) || defined(__digital__) - -/* - * Sun or Digital - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#if defined(__arch64__) || defined(_LP64) -typedef long int khronos_int64_t; -typedef unsigned long int khronos_uint64_t; -#else -typedef long long int khronos_int64_t; -typedef unsigned long long int khronos_uint64_t; -#endif /* __arch64__ */ -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#elif 0 - -/* - * Hypothetical platform with no float or int64 support - */ -typedef int khronos_int32_t; -typedef unsigned int khronos_uint32_t; -#define KHRONOS_SUPPORT_INT64 0 -#define KHRONOS_SUPPORT_FLOAT 0 - -#else - -/* - * Generic fallback - */ -#include -typedef int32_t khronos_int32_t; -typedef uint32_t khronos_uint32_t; -typedef int64_t khronos_int64_t; -typedef uint64_t khronos_uint64_t; -#define KHRONOS_SUPPORT_INT64 1 -#define KHRONOS_SUPPORT_FLOAT 1 - -#endif - - -/* - * Types that are (so far) the same on all platforms - */ -typedef signed char khronos_int8_t; -typedef unsigned char khronos_uint8_t; -typedef signed short int khronos_int16_t; -typedef unsigned short int khronos_uint16_t; - -/* - * Types that differ between LLP64 and LP64 architectures - in LLP64, - * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears - * to be the only LLP64 architecture in current use. - */ -#ifdef _WIN64 -typedef signed long long int khronos_intptr_t; -typedef unsigned long long int khronos_uintptr_t; -typedef signed long long int khronos_ssize_t; -typedef unsigned long long int khronos_usize_t; -#else -typedef signed long int khronos_intptr_t; -typedef unsigned long int khronos_uintptr_t; -typedef signed long int khronos_ssize_t; -typedef unsigned long int khronos_usize_t; -#endif - -#if KHRONOS_SUPPORT_FLOAT -/* - * Float type - */ -typedef float khronos_float_t; -#endif - -#if KHRONOS_SUPPORT_INT64 -/* Time types - * - * These types can be used to represent a time interval in nanoseconds or - * an absolute Unadjusted System Time. Unadjusted System Time is the number - * of nanoseconds since some arbitrary system event (e.g. since the last - * time the system booted). The Unadjusted System Time is an unsigned - * 64 bit value that wraps back to 0 every 584 years. Time intervals - * may be either signed or unsigned. - */ -typedef khronos_uint64_t khronos_utime_nanoseconds_t; -typedef khronos_int64_t khronos_stime_nanoseconds_t; -#endif - -/* - * Dummy value used to pad enum types to 32 bits. - */ -#ifndef KHRONOS_MAX_ENUM -#define KHRONOS_MAX_ENUM 0x7FFFFFFF -#endif - -/* - * Enumerated boolean type - * - * Values other than zero should be considered to be true. Therefore - * comparisons should not be made against KHRONOS_TRUE. - */ -typedef enum { - KHRONOS_FALSE = 0, - KHRONOS_TRUE = 1, - KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_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 (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 (GLAD_API_PTR *GLVULKANPROCNV)(void); - - - -#define GL_ES_VERSION_2_0 1 -GLAD_API_CALL int GLAD_GL_ES_VERSION_2_0; -#define GL_ES_VERSION_3_0 1 -GLAD_API_CALL int GLAD_GL_ES_VERSION_3_0; - - -typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); -typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); -typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, 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 *PFNGLBINDBUFFERPROC)(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 *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); -typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); -typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); -typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); -typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); -typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); -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 *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); -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 *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 *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); -typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); -typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); -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 *PFNGLCLEARDEPTHFPROC)(GLfloat d); -typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); -typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); -typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -typedef void (GLAD_API_PTR *PFNGLCOMPILESHADERPROC)(GLuint shader); -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 *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 *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(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 GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); -typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); -typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); -typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); -typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); -typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); -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 *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 *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 *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); -typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); -typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); -typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); -typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); -typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); -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 *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); -typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); -typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); -typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); -typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); -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 *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); -typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); -typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); -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 *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); -typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(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 *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); -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 *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 *PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint * uniformIndices, GLenum pname, GLint * params); -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 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 *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); -typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); -typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); -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 *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 *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); -typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); -typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * 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 *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); -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 *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 void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); -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 *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); -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 void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); -typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); -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 *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); -typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); -typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); -typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); -typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); -typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); -typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); -typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); -typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); -typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); -typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(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 *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); -typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); -typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); -typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); -typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); -typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); -typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); -typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); -typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length); -typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); -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 *PFNGLRELEASESHADERCOMPILERPROC)(void); -typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); -typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); -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 *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -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 *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 *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 *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 *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 *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); -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 *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 *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); -typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(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 *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); -typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(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 *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(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 *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 *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(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 *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 *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); -typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); -typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); -typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat * v); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); -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 *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 *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); -typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); -typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); -typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); - -GLAD_API_CALL PFNGLACTIVETEXTUREPROC glad_glActiveTexture; - -GLAD_API_CALL PFNGLATTACHSHADERPROC glad_glAttachShader; - -GLAD_API_CALL PFNGLBEGINQUERYPROC glad_glBeginQuery; - -GLAD_API_CALL PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; - -GLAD_API_CALL PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; - -GLAD_API_CALL PFNGLBINDBUFFERPROC glad_glBindBuffer; - -GLAD_API_CALL PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; - -GLAD_API_CALL PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; - -GLAD_API_CALL PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; - -GLAD_API_CALL PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; - -GLAD_API_CALL PFNGLBINDSAMPLERPROC glad_glBindSampler; - -GLAD_API_CALL PFNGLBINDTEXTUREPROC glad_glBindTexture; - -GLAD_API_CALL PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; - -GLAD_API_CALL PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; - -GLAD_API_CALL PFNGLBLENDCOLORPROC glad_glBlendColor; - -GLAD_API_CALL PFNGLBLENDEQUATIONPROC glad_glBlendEquation; - -GLAD_API_CALL PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; - -GLAD_API_CALL PFNGLBLENDFUNCPROC glad_glBlendFunc; - -GLAD_API_CALL PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; - -GLAD_API_CALL PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; - -GLAD_API_CALL PFNGLBUFFERDATAPROC glad_glBufferData; - -GLAD_API_CALL PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; - -GLAD_API_CALL PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; - -GLAD_API_CALL PFNGLCLEARPROC glad_glClear; - -GLAD_API_CALL PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; - -GLAD_API_CALL PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; - -GLAD_API_CALL PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; - -GLAD_API_CALL PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; - -GLAD_API_CALL PFNGLCLEARCOLORPROC glad_glClearColor; - -GLAD_API_CALL PFNGLCLEARDEPTHFPROC glad_glClearDepthf; - -GLAD_API_CALL PFNGLCLEARSTENCILPROC glad_glClearStencil; - -GLAD_API_CALL PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; - -GLAD_API_CALL PFNGLCOLORMASKPROC glad_glColorMask; - -GLAD_API_CALL PFNGLCOMPILESHADERPROC glad_glCompileShader; - -GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; - -GLAD_API_CALL PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; - -GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; - -GLAD_API_CALL PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; - -GLAD_API_CALL PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; - -GLAD_API_CALL PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; - -GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; - -GLAD_API_CALL PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; - -GLAD_API_CALL PFNGLCREATEPROGRAMPROC glad_glCreateProgram; - -GLAD_API_CALL PFNGLCREATESHADERPROC glad_glCreateShader; - -GLAD_API_CALL PFNGLCULLFACEPROC glad_glCullFace; - -GLAD_API_CALL PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; - -GLAD_API_CALL PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; - -GLAD_API_CALL PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; - -GLAD_API_CALL PFNGLDELETEQUERIESPROC glad_glDeleteQueries; - -GLAD_API_CALL PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; - -GLAD_API_CALL PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; - -GLAD_API_CALL PFNGLDELETESHADERPROC glad_glDeleteShader; - -GLAD_API_CALL PFNGLDELETESYNCPROC glad_glDeleteSync; - -GLAD_API_CALL PFNGLDELETETEXTURESPROC glad_glDeleteTextures; - -GLAD_API_CALL PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; - -GLAD_API_CALL PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; - -GLAD_API_CALL PFNGLDEPTHFUNCPROC glad_glDepthFunc; - -GLAD_API_CALL PFNGLDEPTHMASKPROC glad_glDepthMask; - -GLAD_API_CALL PFNGLDEPTHRANGEFPROC glad_glDepthRangef; - -GLAD_API_CALL PFNGLDETACHSHADERPROC glad_glDetachShader; - -GLAD_API_CALL PFNGLDISABLEPROC glad_glDisable; - -GLAD_API_CALL PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; - -GLAD_API_CALL PFNGLDRAWARRAYSPROC glad_glDrawArrays; - -GLAD_API_CALL PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; - -GLAD_API_CALL PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; - -GLAD_API_CALL PFNGLDRAWELEMENTSPROC glad_glDrawElements; - -GLAD_API_CALL PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; - -GLAD_API_CALL PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; - -GLAD_API_CALL PFNGLENABLEPROC glad_glEnable; - -GLAD_API_CALL PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; - -GLAD_API_CALL PFNGLENDQUERYPROC glad_glEndQuery; - -GLAD_API_CALL PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; - -GLAD_API_CALL PFNGLFENCESYNCPROC glad_glFenceSync; - -GLAD_API_CALL PFNGLFINISHPROC glad_glFinish; - -GLAD_API_CALL PFNGLFLUSHPROC glad_glFlush; - -GLAD_API_CALL PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; - -GLAD_API_CALL PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; - -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; - -GLAD_API_CALL PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; - -GLAD_API_CALL PFNGLFRONTFACEPROC glad_glFrontFace; - -GLAD_API_CALL PFNGLGENBUFFERSPROC glad_glGenBuffers; - -GLAD_API_CALL PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; - -GLAD_API_CALL PFNGLGENQUERIESPROC glad_glGenQueries; - -GLAD_API_CALL PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; - -GLAD_API_CALL PFNGLGENSAMPLERSPROC glad_glGenSamplers; - -GLAD_API_CALL PFNGLGENTEXTURESPROC glad_glGenTextures; - -GLAD_API_CALL PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; - -GLAD_API_CALL PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; - -GLAD_API_CALL PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; - -GLAD_API_CALL PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; - -GLAD_API_CALL PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; - -GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; - -GLAD_API_CALL PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; - -GLAD_API_CALL PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; - -GLAD_API_CALL PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; - -GLAD_API_CALL PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; - -GLAD_API_CALL PFNGLGETBOOLEANVPROC glad_glGetBooleanv; - -GLAD_API_CALL PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; - -GLAD_API_CALL PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; - -GLAD_API_CALL PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; - -GLAD_API_CALL PFNGLGETERRORPROC glad_glGetError; - -GLAD_API_CALL PFNGLGETFLOATVPROC glad_glGetFloatv; - -GLAD_API_CALL PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; - -GLAD_API_CALL PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; - -GLAD_API_CALL PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; - -GLAD_API_CALL PFNGLGETINTEGER64VPROC glad_glGetInteger64v; - -GLAD_API_CALL PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; - -GLAD_API_CALL PFNGLGETINTEGERVPROC glad_glGetIntegerv; - -GLAD_API_CALL PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; - -GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; - -GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; - -GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; - -GLAD_API_CALL PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; - -GLAD_API_CALL PFNGLGETQUERYIVPROC glad_glGetQueryiv; - -GLAD_API_CALL PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; - -GLAD_API_CALL PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; - -GLAD_API_CALL PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; - -GLAD_API_CALL PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; - -GLAD_API_CALL PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; - -GLAD_API_CALL PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; - -GLAD_API_CALL PFNGLGETSHADERIVPROC glad_glGetShaderiv; - -GLAD_API_CALL PFNGLGETSTRINGPROC glad_glGetString; - -GLAD_API_CALL PFNGLGETSTRINGIPROC glad_glGetStringi; - -GLAD_API_CALL PFNGLGETSYNCIVPROC glad_glGetSynciv; - -GLAD_API_CALL PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; - -GLAD_API_CALL PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; - -GLAD_API_CALL PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; - -GLAD_API_CALL PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; - -GLAD_API_CALL PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; - -GLAD_API_CALL PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; - -GLAD_API_CALL PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; - -GLAD_API_CALL PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; - -GLAD_API_CALL PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; - -GLAD_API_CALL PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; - -GLAD_API_CALL PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; - -GLAD_API_CALL PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; - -GLAD_API_CALL PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; - -GLAD_API_CALL PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; - -GLAD_API_CALL PFNGLHINTPROC glad_glHint; - -GLAD_API_CALL PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; - -GLAD_API_CALL PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; - -GLAD_API_CALL PFNGLISBUFFERPROC glad_glIsBuffer; - -GLAD_API_CALL PFNGLISENABLEDPROC glad_glIsEnabled; - -GLAD_API_CALL PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; - -GLAD_API_CALL PFNGLISPROGRAMPROC glad_glIsProgram; - -GLAD_API_CALL PFNGLISQUERYPROC glad_glIsQuery; - -GLAD_API_CALL PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; - -GLAD_API_CALL PFNGLISSAMPLERPROC glad_glIsSampler; - -GLAD_API_CALL PFNGLISSHADERPROC glad_glIsShader; - -GLAD_API_CALL PFNGLISSYNCPROC glad_glIsSync; - -GLAD_API_CALL PFNGLISTEXTUREPROC glad_glIsTexture; - -GLAD_API_CALL PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; - -GLAD_API_CALL PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; - -GLAD_API_CALL PFNGLLINEWIDTHPROC glad_glLineWidth; - -GLAD_API_CALL PFNGLLINKPROGRAMPROC glad_glLinkProgram; - -GLAD_API_CALL PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; - -GLAD_API_CALL PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; - -GLAD_API_CALL PFNGLPIXELSTOREIPROC glad_glPixelStorei; - -GLAD_API_CALL PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; - -GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary; - -GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; - -GLAD_API_CALL PFNGLREADBUFFERPROC glad_glReadBuffer; - -GLAD_API_CALL PFNGLREADPIXELSPROC glad_glReadPixels; - -GLAD_API_CALL PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; - -GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; - -GLAD_API_CALL PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; - -GLAD_API_CALL PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; - -GLAD_API_CALL PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; - -GLAD_API_CALL PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; - -GLAD_API_CALL PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; - -GLAD_API_CALL PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; - -GLAD_API_CALL PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; - -GLAD_API_CALL PFNGLSCISSORPROC glad_glScissor; - -GLAD_API_CALL PFNGLSHADERBINARYPROC glad_glShaderBinary; - -GLAD_API_CALL PFNGLSHADERSOURCEPROC glad_glShaderSource; - -GLAD_API_CALL PFNGLSTENCILFUNCPROC glad_glStencilFunc; - -GLAD_API_CALL PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; - -GLAD_API_CALL PFNGLSTENCILMASKPROC glad_glStencilMask; - -GLAD_API_CALL PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; - -GLAD_API_CALL PFNGLSTENCILOPPROC glad_glStencilOp; - -GLAD_API_CALL PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; - -GLAD_API_CALL PFNGLTEXIMAGE2DPROC glad_glTexImage2D; - -GLAD_API_CALL PFNGLTEXIMAGE3DPROC glad_glTexImage3D; - -GLAD_API_CALL PFNGLTEXPARAMETERFPROC glad_glTexParameterf; - -GLAD_API_CALL PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; - -GLAD_API_CALL PFNGLTEXPARAMETERIPROC glad_glTexParameteri; - -GLAD_API_CALL PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; - -GLAD_API_CALL PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; - -GLAD_API_CALL PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; - -GLAD_API_CALL PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; - -GLAD_API_CALL PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; - -GLAD_API_CALL PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; - -GLAD_API_CALL PFNGLUNIFORM1FPROC glad_glUniform1f; - -GLAD_API_CALL PFNGLUNIFORM1FVPROC glad_glUniform1fv; - -GLAD_API_CALL PFNGLUNIFORM1IPROC glad_glUniform1i; - -GLAD_API_CALL PFNGLUNIFORM1IVPROC glad_glUniform1iv; - -GLAD_API_CALL PFNGLUNIFORM1UIPROC glad_glUniform1ui; - -GLAD_API_CALL PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; - -GLAD_API_CALL PFNGLUNIFORM2FPROC glad_glUniform2f; - -GLAD_API_CALL PFNGLUNIFORM2FVPROC glad_glUniform2fv; - -GLAD_API_CALL PFNGLUNIFORM2IPROC glad_glUniform2i; - -GLAD_API_CALL PFNGLUNIFORM2IVPROC glad_glUniform2iv; - -GLAD_API_CALL PFNGLUNIFORM2UIPROC glad_glUniform2ui; - -GLAD_API_CALL PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; - -GLAD_API_CALL PFNGLUNIFORM3FPROC glad_glUniform3f; - -GLAD_API_CALL PFNGLUNIFORM3FVPROC glad_glUniform3fv; - -GLAD_API_CALL PFNGLUNIFORM3IPROC glad_glUniform3i; - -GLAD_API_CALL PFNGLUNIFORM3IVPROC glad_glUniform3iv; - -GLAD_API_CALL PFNGLUNIFORM3UIPROC glad_glUniform3ui; - -GLAD_API_CALL PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; - -GLAD_API_CALL PFNGLUNIFORM4FPROC glad_glUniform4f; - -GLAD_API_CALL PFNGLUNIFORM4FVPROC glad_glUniform4fv; - -GLAD_API_CALL PFNGLUNIFORM4IPROC glad_glUniform4i; - -GLAD_API_CALL PFNGLUNIFORM4IVPROC glad_glUniform4iv; - -GLAD_API_CALL PFNGLUNIFORM4UIPROC glad_glUniform4ui; - -GLAD_API_CALL PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; - -GLAD_API_CALL PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; - -GLAD_API_CALL PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; - -GLAD_API_CALL PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; - -GLAD_API_CALL PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; - -GLAD_API_CALL PFNGLUSEPROGRAMPROC glad_glUseProgram; - -GLAD_API_CALL PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; - -GLAD_API_CALL PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; - -GLAD_API_CALL PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; - -GLAD_API_CALL PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; - -GLAD_API_CALL PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; - -GLAD_API_CALL PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; - -GLAD_API_CALL PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; - -GLAD_API_CALL PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; - -GLAD_API_CALL PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; - -GLAD_API_CALL PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; - -GLAD_API_CALL PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; - -GLAD_API_CALL PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; - -GLAD_API_CALL PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; - -GLAD_API_CALL PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; - -GLAD_API_CALL PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; - -GLAD_API_CALL PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; - -GLAD_API_CALL PFNGLVIEWPORTPROC glad_glViewport; - -GLAD_API_CALL PFNGLWAITSYNCPROC glad_glWaitSync; - - - - - - -GLAD_API_CALL int gladLoadGLES2UserPtr( GLADuserptrloadfunc load, void *userptr); -GLAD_API_CALL int gladLoadGLES2( GLADloadfunc load); - - - -#ifdef __cplusplus -} -#endif -#endif - -/* Source */ -#ifdef GLAD_GLES2_IMPLEMENTATION -#include -#include -#include - -#ifndef GLAD_IMPL_UTIL_C_ -#define GLAD_IMPL_UTIL_C_ - -#ifdef _MSC_VER -#define GLAD_IMPL_UTIL_SSCANF sscanf_s -#else -#define GLAD_IMPL_UTIL_SSCANF sscanf -#endif - -#endif /* GLAD_IMPL_UTIL_C_ */ - -#ifdef __cplusplus -extern "C" { -#endif - - - -int GLAD_GL_ES_VERSION_2_0 = 0; -int GLAD_GL_ES_VERSION_3_0 = 0; - - - -PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; -PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; -PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; -PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; -PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; -PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; -PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; -PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; -PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; -PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; -PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; -PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; -PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback = NULL; -PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; -PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; -PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; -PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; -PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; -PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; -PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; -PFNGLBUFFERDATAPROC glad_glBufferData = NULL; -PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; -PFNGLCLEARPROC glad_glClear = NULL; -PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; -PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; -PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; -PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; -PFNGLCLEARCOLORPROC glad_glClearColor = NULL; -PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL; -PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; -PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; -PFNGLCOLORMASKPROC glad_glColorMask = NULL; -PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; -PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; -PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; -PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; -PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; -PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; -PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; -PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; -PFNGLCREATESHADERPROC glad_glCreateShader = NULL; -PFNGLCULLFACEPROC glad_glCullFace = NULL; -PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; -PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; -PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; -PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; -PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; -PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; -PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; -PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; -PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; -PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks = NULL; -PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; -PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; -PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; -PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL; -PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; -PFNGLDISABLEPROC glad_glDisable = NULL; -PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; -PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; -PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; -PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; -PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; -PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; -PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; -PFNGLENABLEPROC glad_glEnable = NULL; -PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; -PFNGLENDQUERYPROC glad_glEndQuery = NULL; -PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; -PFNGLFENCESYNCPROC glad_glFenceSync = NULL; -PFNGLFINISHPROC glad_glFinish = NULL; -PFNGLFLUSHPROC glad_glFlush = NULL; -PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; -PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; -PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; -PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; -PFNGLFRONTFACEPROC glad_glFrontFace = NULL; -PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; -PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; -PFNGLGENQUERIESPROC glad_glGenQueries = NULL; -PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; -PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; -PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; -PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks = NULL; -PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; -PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; -PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; -PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; -PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; -PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; -PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; -PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; -PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; -PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; -PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; -PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; -PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; -PFNGLGETERRORPROC glad_glGetError = NULL; -PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; -PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; -PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; -PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; -PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; -PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; -PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ = NULL; -PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL; -PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; -PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; -PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; -PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; -PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; -PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; -PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; -PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL; -PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; -PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; -PFNGLGETSTRINGPROC glad_glGetString = NULL; -PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; -PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; -PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; -PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; -PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; -PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; -PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; -PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; -PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; -PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; -PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; -PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; -PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; -PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; -PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; -PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; -PFNGLHINTPROC glad_glHint = NULL; -PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer = NULL; -PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer = NULL; -PFNGLISBUFFERPROC glad_glIsBuffer = NULL; -PFNGLISENABLEDPROC glad_glIsEnabled = NULL; -PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; -PFNGLISPROGRAMPROC glad_glIsProgram = NULL; -PFNGLISQUERYPROC glad_glIsQuery = NULL; -PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; -PFNGLISSAMPLERPROC glad_glIsSampler = NULL; -PFNGLISSHADERPROC glad_glIsShader = NULL; -PFNGLISSYNCPROC glad_glIsSync = NULL; -PFNGLISTEXTUREPROC glad_glIsTexture = NULL; -PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback = NULL; -PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; -PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; -PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; -PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; -PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback = NULL; -PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; -PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; -PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL; -PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL; -PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; -PFNGLREADPIXELSPROC glad_glReadPixels = NULL; -PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL; -PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; -PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback = NULL; -PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; -PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; -PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; -PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; -PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; -PFNGLSCISSORPROC glad_glScissor = NULL; -PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL; -PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; -PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; -PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; -PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; -PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; -PFNGLSTENCILOPPROC glad_glStencilOp = NULL; -PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; -PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; -PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; -PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; -PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; -PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; -PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; -PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D = NULL; -PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D = NULL; -PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; -PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; -PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; -PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; -PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; -PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; -PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; -PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; -PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; -PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; -PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; -PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; -PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; -PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; -PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; -PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; -PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; -PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; -PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; -PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; -PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; -PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; -PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; -PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; -PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; -PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; -PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; -PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; -PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; -PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; -PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; -PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; -PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; -PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; -PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; -PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; -PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; -PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; -PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; -PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; -PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; -PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; -PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; -PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; -PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; -PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; -PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; -PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; -PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; -PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; -PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; -PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; -PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; -PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; -PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; -PFNGLVIEWPORTPROC glad_glViewport = NULL; -PFNGLWAITSYNCPROC glad_glWaitSync = NULL; - - -static void glad_gl_load_GL_ES_VERSION_2_0( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_ES_VERSION_2_0) return; - glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC) load(userptr, "glActiveTexture"); - glad_glAttachShader = (PFNGLATTACHSHADERPROC) load(userptr, "glAttachShader"); - glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) load(userptr, "glBindAttribLocation"); - glad_glBindBuffer = (PFNGLBINDBUFFERPROC) load(userptr, "glBindBuffer"); - glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) load(userptr, "glBindFramebuffer"); - glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) load(userptr, "glBindRenderbuffer"); - glad_glBindTexture = (PFNGLBINDTEXTUREPROC) load(userptr, "glBindTexture"); - glad_glBlendColor = (PFNGLBLENDCOLORPROC) load(userptr, "glBlendColor"); - glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC) load(userptr, "glBlendEquation"); - glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC) load(userptr, "glBlendEquationSeparate"); - glad_glBlendFunc = (PFNGLBLENDFUNCPROC) load(userptr, "glBlendFunc"); - glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC) load(userptr, "glBlendFuncSeparate"); - glad_glBufferData = (PFNGLBUFFERDATAPROC) load(userptr, "glBufferData"); - glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC) load(userptr, "glBufferSubData"); - glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) load(userptr, "glCheckFramebufferStatus"); - glad_glClear = (PFNGLCLEARPROC) load(userptr, "glClear"); - glad_glClearColor = (PFNGLCLEARCOLORPROC) load(userptr, "glClearColor"); - glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); - glad_glClearStencil = (PFNGLCLEARSTENCILPROC) load(userptr, "glClearStencil"); - glad_glColorMask = (PFNGLCOLORMASKPROC) load(userptr, "glColorMask"); - glad_glCompileShader = (PFNGLCOMPILESHADERPROC) load(userptr, "glCompileShader"); - glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC) load(userptr, "glCompressedTexImage2D"); - glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) load(userptr, "glCompressedTexSubImage2D"); - glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC) load(userptr, "glCopyTexImage2D"); - glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC) load(userptr, "glCopyTexSubImage2D"); - glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC) load(userptr, "glCreateProgram"); - glad_glCreateShader = (PFNGLCREATESHADERPROC) load(userptr, "glCreateShader"); - glad_glCullFace = (PFNGLCULLFACEPROC) load(userptr, "glCullFace"); - glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) load(userptr, "glDeleteBuffers"); - glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) load(userptr, "glDeleteFramebuffers"); - glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC) load(userptr, "glDeleteProgram"); - glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) load(userptr, "glDeleteRenderbuffers"); - glad_glDeleteShader = (PFNGLDELETESHADERPROC) load(userptr, "glDeleteShader"); - glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC) load(userptr, "glDeleteTextures"); - glad_glDepthFunc = (PFNGLDEPTHFUNCPROC) load(userptr, "glDepthFunc"); - glad_glDepthMask = (PFNGLDEPTHMASKPROC) load(userptr, "glDepthMask"); - glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); - glad_glDetachShader = (PFNGLDETACHSHADERPROC) load(userptr, "glDetachShader"); - glad_glDisable = (PFNGLDISABLEPROC) load(userptr, "glDisable"); - glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) load(userptr, "glDisableVertexAttribArray"); - glad_glDrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); - glad_glDrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); - glad_glEnable = (PFNGLENABLEPROC) load(userptr, "glEnable"); - glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) load(userptr, "glEnableVertexAttribArray"); - glad_glFinish = (PFNGLFINISHPROC) load(userptr, "glFinish"); - glad_glFlush = (PFNGLFLUSHPROC) load(userptr, "glFlush"); - glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) load(userptr, "glFramebufferRenderbuffer"); - glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) load(userptr, "glFramebufferTexture2D"); - glad_glFrontFace = (PFNGLFRONTFACEPROC) load(userptr, "glFrontFace"); - glad_glGenBuffers = (PFNGLGENBUFFERSPROC) load(userptr, "glGenBuffers"); - glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) load(userptr, "glGenFramebuffers"); - glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) load(userptr, "glGenRenderbuffers"); - glad_glGenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); - glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) load(userptr, "glGenerateMipmap"); - glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC) load(userptr, "glGetActiveAttrib"); - glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC) load(userptr, "glGetActiveUniform"); - glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC) load(userptr, "glGetAttachedShaders"); - glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) load(userptr, "glGetAttribLocation"); - glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC) load(userptr, "glGetBooleanv"); - glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC) load(userptr, "glGetBufferParameteriv"); - glad_glGetError = (PFNGLGETERRORPROC) load(userptr, "glGetError"); - glad_glGetFloatv = (PFNGLGETFLOATVPROC) load(userptr, "glGetFloatv"); - glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) load(userptr, "glGetFramebufferAttachmentParameteriv"); - glad_glGetIntegerv = (PFNGLGETINTEGERVPROC) load(userptr, "glGetIntegerv"); - glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) load(userptr, "glGetProgramInfoLog"); - glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC) load(userptr, "glGetProgramiv"); - glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) load(userptr, "glGetRenderbufferParameteriv"); - glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) load(userptr, "glGetShaderInfoLog"); - glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); - glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC) load(userptr, "glGetShaderSource"); - glad_glGetShaderiv = (PFNGLGETSHADERIVPROC) load(userptr, "glGetShaderiv"); - glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); - glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC) load(userptr, "glGetTexParameterfv"); - glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC) load(userptr, "glGetTexParameteriv"); - glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) load(userptr, "glGetUniformLocation"); - glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC) load(userptr, "glGetUniformfv"); - glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC) load(userptr, "glGetUniformiv"); - glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC) load(userptr, "glGetVertexAttribPointerv"); - glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC) load(userptr, "glGetVertexAttribfv"); - glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC) load(userptr, "glGetVertexAttribiv"); - glad_glHint = (PFNGLHINTPROC) load(userptr, "glHint"); - glad_glIsBuffer = (PFNGLISBUFFERPROC) load(userptr, "glIsBuffer"); - glad_glIsEnabled = (PFNGLISENABLEDPROC) load(userptr, "glIsEnabled"); - glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) load(userptr, "glIsFramebuffer"); - glad_glIsProgram = (PFNGLISPROGRAMPROC) load(userptr, "glIsProgram"); - glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) load(userptr, "glIsRenderbuffer"); - glad_glIsShader = (PFNGLISSHADERPROC) load(userptr, "glIsShader"); - glad_glIsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); - glad_glLineWidth = (PFNGLLINEWIDTHPROC) load(userptr, "glLineWidth"); - glad_glLinkProgram = (PFNGLLINKPROGRAMPROC) load(userptr, "glLinkProgram"); - glad_glPixelStorei = (PFNGLPIXELSTOREIPROC) load(userptr, "glPixelStorei"); - glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); - glad_glReadPixels = (PFNGLREADPIXELSPROC) load(userptr, "glReadPixels"); - glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); - glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage"); - glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC) load(userptr, "glSampleCoverage"); - glad_glScissor = (PFNGLSCISSORPROC) load(userptr, "glScissor"); - glad_glShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); - glad_glShaderSource = (PFNGLSHADERSOURCEPROC) load(userptr, "glShaderSource"); - glad_glStencilFunc = (PFNGLSTENCILFUNCPROC) load(userptr, "glStencilFunc"); - glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC) load(userptr, "glStencilFuncSeparate"); - glad_glStencilMask = (PFNGLSTENCILMASKPROC) load(userptr, "glStencilMask"); - glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC) load(userptr, "glStencilMaskSeparate"); - glad_glStencilOp = (PFNGLSTENCILOPPROC) load(userptr, "glStencilOp"); - glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC) load(userptr, "glStencilOpSeparate"); - glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC) load(userptr, "glTexImage2D"); - glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC) load(userptr, "glTexParameterf"); - glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC) load(userptr, "glTexParameterfv"); - glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC) load(userptr, "glTexParameteri"); - glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC) load(userptr, "glTexParameteriv"); - glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC) load(userptr, "glTexSubImage2D"); - glad_glUniform1f = (PFNGLUNIFORM1FPROC) load(userptr, "glUniform1f"); - glad_glUniform1fv = (PFNGLUNIFORM1FVPROC) load(userptr, "glUniform1fv"); - glad_glUniform1i = (PFNGLUNIFORM1IPROC) load(userptr, "glUniform1i"); - glad_glUniform1iv = (PFNGLUNIFORM1IVPROC) load(userptr, "glUniform1iv"); - glad_glUniform2f = (PFNGLUNIFORM2FPROC) load(userptr, "glUniform2f"); - glad_glUniform2fv = (PFNGLUNIFORM2FVPROC) load(userptr, "glUniform2fv"); - glad_glUniform2i = (PFNGLUNIFORM2IPROC) load(userptr, "glUniform2i"); - glad_glUniform2iv = (PFNGLUNIFORM2IVPROC) load(userptr, "glUniform2iv"); - glad_glUniform3f = (PFNGLUNIFORM3FPROC) load(userptr, "glUniform3f"); - glad_glUniform3fv = (PFNGLUNIFORM3FVPROC) load(userptr, "glUniform3fv"); - glad_glUniform3i = (PFNGLUNIFORM3IPROC) load(userptr, "glUniform3i"); - glad_glUniform3iv = (PFNGLUNIFORM3IVPROC) load(userptr, "glUniform3iv"); - glad_glUniform4f = (PFNGLUNIFORM4FPROC) load(userptr, "glUniform4f"); - glad_glUniform4fv = (PFNGLUNIFORM4FVPROC) load(userptr, "glUniform4fv"); - glad_glUniform4i = (PFNGLUNIFORM4IPROC) load(userptr, "glUniform4i"); - glad_glUniform4iv = (PFNGLUNIFORM4IVPROC) load(userptr, "glUniform4iv"); - glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC) load(userptr, "glUniformMatrix2fv"); - glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) load(userptr, "glUniformMatrix3fv"); - glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) load(userptr, "glUniformMatrix4fv"); - glad_glUseProgram = (PFNGLUSEPROGRAMPROC) load(userptr, "glUseProgram"); - glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC) load(userptr, "glValidateProgram"); - glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC) load(userptr, "glVertexAttrib1f"); - glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC) load(userptr, "glVertexAttrib1fv"); - glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC) load(userptr, "glVertexAttrib2f"); - glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC) load(userptr, "glVertexAttrib2fv"); - glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC) load(userptr, "glVertexAttrib3f"); - glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC) load(userptr, "glVertexAttrib3fv"); - glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC) load(userptr, "glVertexAttrib4f"); - glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC) load(userptr, "glVertexAttrib4fv"); - glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) load(userptr, "glVertexAttribPointer"); - glad_glViewport = (PFNGLVIEWPORTPROC) load(userptr, "glViewport"); -} -static void glad_gl_load_GL_ES_VERSION_3_0( GLADuserptrloadfunc load, void* userptr) { - if(!GLAD_GL_ES_VERSION_3_0) return; - glad_glBeginQuery = (PFNGLBEGINQUERYPROC) load(userptr, "glBeginQuery"); - glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC) load(userptr, "glBeginTransformFeedback"); - glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) load(userptr, "glBindBufferBase"); - glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) load(userptr, "glBindBufferRange"); - glad_glBindSampler = (PFNGLBINDSAMPLERPROC) load(userptr, "glBindSampler"); - glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); - glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) load(userptr, "glBindVertexArray"); - glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) load(userptr, "glBlitFramebuffer"); - glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC) load(userptr, "glClearBufferfi"); - glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) load(userptr, "glClearBufferfv"); - glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) load(userptr, "glClearBufferiv"); - glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC) load(userptr, "glClearBufferuiv"); - glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC) load(userptr, "glClientWaitSync"); - glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC) load(userptr, "glCompressedTexImage3D"); - glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) load(userptr, "glCompressedTexSubImage3D"); - glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC) load(userptr, "glCopyBufferSubData"); - glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) load(userptr, "glCopyTexSubImage3D"); - glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC) load(userptr, "glDeleteQueries"); - glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) load(userptr, "glDeleteSamplers"); - glad_glDeleteSync = (PFNGLDELETESYNCPROC) load(userptr, "glDeleteSync"); - glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); - glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) load(userptr, "glDeleteVertexArrays"); - glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) load(userptr, "glDrawArraysInstanced"); - glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC) load(userptr, "glDrawBuffers"); - glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) load(userptr, "glDrawElementsInstanced"); - glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) load(userptr, "glDrawRangeElements"); - glad_glEndQuery = (PFNGLENDQUERYPROC) load(userptr, "glEndQuery"); - glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) load(userptr, "glEndTransformFeedback"); - glad_glFenceSync = (PFNGLFENCESYNCPROC) load(userptr, "glFenceSync"); - glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC) load(userptr, "glFlushMappedBufferRange"); - glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) load(userptr, "glFramebufferTextureLayer"); - glad_glGenQueries = (PFNGLGENQUERIESPROC) load(userptr, "glGenQueries"); - glad_glGenSamplers = (PFNGLGENSAMPLERSPROC) load(userptr, "glGenSamplers"); - glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); - glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) load(userptr, "glGenVertexArrays"); - glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) load(userptr, "glGetActiveUniformBlockName"); - glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC) load(userptr, "glGetActiveUniformBlockiv"); - glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) load(userptr, "glGetActiveUniformsiv"); - glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC) load(userptr, "glGetBufferParameteri64v"); - glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC) load(userptr, "glGetBufferPointerv"); - glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC) load(userptr, "glGetFragDataLocation"); - glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC) load(userptr, "glGetInteger64i_v"); - glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC) load(userptr, "glGetInteger64v"); - glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC) load(userptr, "glGetIntegeri_v"); - glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); - glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); - glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC) load(userptr, "glGetQueryObjectuiv"); - glad_glGetQueryiv = (PFNGLGETQUERYIVPROC) load(userptr, "glGetQueryiv"); - glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC) load(userptr, "glGetSamplerParameterfv"); - glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC) load(userptr, "glGetSamplerParameteriv"); - glad_glGetStringi = (PFNGLGETSTRINGIPROC) load(userptr, "glGetStringi"); - glad_glGetSynciv = (PFNGLGETSYNCIVPROC) load(userptr, "glGetSynciv"); - glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) load(userptr, "glGetTransformFeedbackVarying"); - glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC) load(userptr, "glGetUniformBlockIndex"); - glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC) load(userptr, "glGetUniformIndices"); - glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC) load(userptr, "glGetUniformuiv"); - glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC) load(userptr, "glGetVertexAttribIiv"); - glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC) load(userptr, "glGetVertexAttribIuiv"); - glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); - glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); - glad_glIsQuery = (PFNGLISQUERYPROC) load(userptr, "glIsQuery"); - glad_glIsSampler = (PFNGLISSAMPLERPROC) load(userptr, "glIsSampler"); - glad_glIsSync = (PFNGLISSYNCPROC) load(userptr, "glIsSync"); - glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); - glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC) load(userptr, "glIsVertexArray"); - glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) load(userptr, "glMapBufferRange"); - glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); - glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); - glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); - glad_glReadBuffer = (PFNGLREADBUFFERPROC) load(userptr, "glReadBuffer"); - glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample"); - glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); - glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC) load(userptr, "glSamplerParameterf"); - glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC) load(userptr, "glSamplerParameterfv"); - glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC) load(userptr, "glSamplerParameteri"); - glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC) load(userptr, "glSamplerParameteriv"); - glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC) load(userptr, "glTexImage3D"); - glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); - glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); - glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC) load(userptr, "glTexSubImage3D"); - glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) load(userptr, "glTransformFeedbackVaryings"); - glad_glUniform1ui = (PFNGLUNIFORM1UIPROC) load(userptr, "glUniform1ui"); - glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC) load(userptr, "glUniform1uiv"); - glad_glUniform2ui = (PFNGLUNIFORM2UIPROC) load(userptr, "glUniform2ui"); - glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC) load(userptr, "glUniform2uiv"); - glad_glUniform3ui = (PFNGLUNIFORM3UIPROC) load(userptr, "glUniform3ui"); - glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC) load(userptr, "glUniform3uiv"); - glad_glUniform4ui = (PFNGLUNIFORM4UIPROC) load(userptr, "glUniform4ui"); - glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC) load(userptr, "glUniform4uiv"); - glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC) load(userptr, "glUniformBlockBinding"); - glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC) load(userptr, "glUniformMatrix2x3fv"); - glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC) load(userptr, "glUniformMatrix2x4fv"); - glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC) load(userptr, "glUniformMatrix3x2fv"); - glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC) load(userptr, "glUniformMatrix3x4fv"); - glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC) load(userptr, "glUniformMatrix4x2fv"); - glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC) load(userptr, "glUniformMatrix4x3fv"); - glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC) load(userptr, "glUnmapBuffer"); - glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) load(userptr, "glVertexAttribDivisor"); - glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC) load(userptr, "glVertexAttribI4i"); - glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC) load(userptr, "glVertexAttribI4iv"); - glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC) load(userptr, "glVertexAttribI4ui"); - glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC) load(userptr, "glVertexAttribI4uiv"); - glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) load(userptr, "glVertexAttribIPointer"); - glad_glWaitSync = (PFNGLWAITSYNCPROC) load(userptr, "glWaitSync"); -} - - - -#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) -#define GLAD_GL_IS_SOME_NEW_VERSION 1 -#else -#define GLAD_GL_IS_SOME_NEW_VERSION 0 -#endif - -static int glad_gl_get_extensions( int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) { -#if GLAD_GL_IS_SOME_NEW_VERSION - if(GLAD_VERSION_MAJOR(version) < 3) { -#else - (void) version; - (void) out_num_exts_i; - (void) out_exts_i; -#endif - if (glad_glGetString == NULL) { - return 0; - } - *out_exts = (const char *)glad_glGetString(GL_EXTENSIONS); -#if GLAD_GL_IS_SOME_NEW_VERSION - } else { - unsigned int index = 0; - unsigned int num_exts_i = 0; - char **exts_i = NULL; - if (glad_glGetStringi == NULL || glad_glGetIntegerv == NULL) { - return 0; - } - glad_glGetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); - if (num_exts_i > 0) { - exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i)); - } - if (exts_i == NULL) { - return 0; - } - for(index = 0; index < num_exts_i; index++) { - const char *gl_str_tmp = (const char*) glad_glGetStringi(GL_EXTENSIONS, index); - size_t len = strlen(gl_str_tmp) + 1; - - char *local_str = (char*) malloc(len * sizeof(char)); - if(local_str != NULL) { - memcpy(local_str, gl_str_tmp, len * sizeof(char)); - } - - exts_i[index] = local_str; - } - - *out_num_exts_i = num_exts_i; - *out_exts_i = exts_i; - } -#endif - return 1; -} -static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) { - if (exts_i != NULL) { - unsigned int index; - for(index = 0; index < num_exts_i; index++) { - free((void *) (exts_i[index])); - } - free((void *)exts_i); - exts_i = NULL; - } -} -static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) { - if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) { - const char *extensions; - const char *loc; - const char *terminator; - extensions = exts; - if(extensions == NULL || ext == NULL) { - return 0; - } - while(1) { - loc = strstr(extensions, ext); - if(loc == NULL) { - return 0; - } - terminator = loc + strlen(ext); - if((loc == extensions || *(loc - 1) == ' ') && - (*terminator == ' ' || *terminator == '\0')) { - return 1; - } - extensions = terminator; - } - } else { - unsigned int index; - for(index = 0; index < num_exts_i; index++) { - const char *e = exts_i[index]; - if(strcmp(e, ext) == 0) { - return 1; - } - } - } - return 0; -} - -static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name) { - return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); -} - -static int glad_gl_find_extensions_gles2( int version) { - const char *exts = NULL; - unsigned int num_exts_i = 0; - char **exts_i = NULL; - if (!glad_gl_get_extensions(version, &exts, &num_exts_i, &exts_i)) return 0; - - (void) glad_gl_has_extension; - - glad_gl_free_extensions(exts_i, num_exts_i); - - return 1; -} - -static int glad_gl_find_core_gles2(void) { - int i; - const char* version; - const char* prefixes[] = { - "OpenGL ES-CM ", - "OpenGL ES-CL ", - "OpenGL ES ", - "OpenGL SC ", - NULL - }; - int major = 0; - int minor = 0; - version = (const char*) glad_glGetString(GL_VERSION); - if (!version) return 0; - for (i = 0; prefixes[i]; i++) { - const size_t length = strlen(prefixes[i]); - if (strncmp(version, prefixes[i], length) == 0) { - version += length; - break; - } - } - - GLAD_IMPL_UTIL_SSCANF(version, "%d.%d", &major, &minor); - - GLAD_GL_ES_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; - GLAD_GL_ES_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; - - return GLAD_MAKE_VERSION(major, minor); -} - -int gladLoadGLES2UserPtr( GLADuserptrloadfunc load, void *userptr) { - int version; - - glad_glGetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); - if(glad_glGetString == NULL) return 0; - if(glad_glGetString(GL_VERSION) == NULL) return 0; - version = glad_gl_find_core_gles2(); - - glad_gl_load_GL_ES_VERSION_2_0(load, userptr); - glad_gl_load_GL_ES_VERSION_3_0(load, userptr); - - if (!glad_gl_find_extensions_gles2(version)) return 0; - - - - return version; -} - - -int gladLoadGLES2( GLADloadfunc load) { - return gladLoadGLES2UserPtr( glad_gl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); -} - - - - - - -#ifdef __cplusplus -} -#endif - -#endif /* GLAD_GLES2_IMPLEMENTATION */ - diff --git a/modules/opengles/module.onyx b/modules/opengles/module.onyx deleted file mode 100644 index 476f03e8..00000000 --- a/modules/opengles/module.onyx +++ /dev/null @@ -1,912 +0,0 @@ -package opengles - -use package core { cptr } - -#if #defined((package runtime).Generated_Foreign_Info) { - foreign_block :: __foreign_block -} else { - #library "onyx_opengles" -} - -GLGetProcAddress :: #distinct i64 // (name: cstr) -> ^void - -#local __foreign_block :: #foreign "onyx_opengles" { - // glInit MUST be called before any other GL calls, as it initializes all GL function pointers - // using the load_function provided. Currently, the only supported library that provides this - // is glfwGetLoadProcAddress. - glInit :: (load_function: GLGetProcAddress) -> void --- - - glActiveTexture :: (texture: GLenum) -> void --- - glAttachShader :: (program: GLuint, shader: GLuint) -> void --- - glBindAttribLocation :: (program: GLuint, index: GLuint, name: ^GLchar) -> void --- - glBindBuffer :: (target: GLenum, buffer: GLint) -> void --- - glBindFramebuffer :: (target: GLenum, framebuffer: GLint) -> void --- - glBindRenderbuffer :: (target: GLenum, renderbuffer: GLint) -> void --- - glBindTexture :: (target: GLenum, texture: GLint) -> void --- - glBlendColor :: (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) -> void --- - glBlendEquation :: (mode: GLenum) -> void --- - glBlendEquationSeparate :: (modeRGB: GLenum, modeAlpha: GLenum) -> void --- - glBlendFunc :: (sfactor: GLenum, dfactor: GLenum) -> void --- - glBlendFuncSeparate :: (sfactorRGB: GLenum, dfactorRGB: GLenum, sfactorAlpha: GLenum, dfactorAlpha: GLenum) -> void --- - glBufferData :: (target: GLenum, size: GLsizeiptr, data: rawptr, usage: GLenum) -> void --- - glBufferSubData :: (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: rawptr) -> void --- - glCheckFramebufferStatus :: (target: GLenum) -> GLenum --- - glClear :: (mask: GLbitfield) -> void --- - glClearColor :: (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) -> void --- - glClearDepthf :: (d: GLfloat) -> void --- - glClearStencil :: (s: GLint) -> void --- - glColorMask :: (red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) -> void --- - glCompileShader :: (shader: GLuint) -> void --- - glCompressedTexImage2D :: (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, data: rawptr) -> void --- - glCompressedTexSubImage2D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, data: rawptr) -> void --- - glCopyTexImage2D :: (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) -> void --- - glCopyTexSubImage2D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- - glCreateProgram :: () -> GLuint --- - glCreateShader :: (type: GLenum) -> GLuint --- - glCullFace :: (mode: GLenum) -> void --- - glDeleteBuffers :: (n: GLsizei, buffers: ^GLuint) -> void --- - glDeleteFramebuffers :: (n: GLsizei, framebuffers: ^GLuint) -> void --- - glDeleteProgram :: (program: GLuint) -> void --- - glDeleteRenderbuffers :: (n: GLsizei, renderbuffers: ^GLuint) -> void --- - glDeleteShader :: (shader: GLuint) -> void --- - glDeleteTextures :: (n: GLsizei, textures: ^GLuint) -> void --- - glDepthFunc :: (func: GLenum) -> void --- - glDepthMask :: (flag: GLboolean) -> void --- - glDepthRangef :: (n: GLfloat, f: GLfloat) -> void --- - glDetachShader :: (program: GLuint, shader: GLuint) -> void --- - glDisable :: (cap: GLenum) -> void --- - glDisableVertexAttribArray :: (index: GLuint) -> void --- - glDrawArrays :: (mode: GLenum, first: GLint, count: GLsizei) -> void --- - glDrawElements :: (mode: GLenum, count: GLsizei, type: GLenum, indices: rawptr) -> void --- - glEnable :: (cap: GLenum) -> void --- - glEnableVertexAttribArray :: (index: GLuint) -> void --- - glFinish :: () -> void --- - glFlush :: () -> void --- - glFramebufferRenderbuffer :: (target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLuint) -> void --- - glFramebufferTexture2D :: (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) -> void --- - glFrontFace :: (mode: GLenum) -> void --- - glGenBuffers :: (n: GLsizei, buffers: ^GLuint) -> void --- - glGenerateMipmap :: (target: GLenum) -> void --- - glGenFramebuffers :: (n: GLsizei, framebuffers: ^GLuint) -> void --- - glGenRenderbuffers :: (n: GLsizei, renderbuffers: ^GLuint) -> void --- - glGenTextures :: (n: GLsizei, textures: ^GLuint) -> void --- - glGetActiveAttrib :: (program: GLuint, index: GLuint, bufSize: GLsizei, length: ^GLsizei, size: ^GLint, type: ^GLenum, name: ^GLchar) -> void --- - glGetActiveUniform :: (program: GLuint, index: GLuint, bufSize: GLsizei, length: ^GLsizei, size: ^GLint, type: ^GLenum, name: ^GLchar) -> void --- - glGetAttachedShaders :: (program: GLuint, maxCount: GLsizei, count: ^GLsizei, shaders: ^GLuint) -> void --- - glGetAttribLocation :: (program: GLuint, name: ^GLchar) -> GLint --- - glGetBooleanv :: (pname: GLenum, data: ^GLboolean) -> void --- - glGetBufferParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- - glGetError :: () -> GLenum --- - glGetFloatv :: (pname: GLenum, data: ^GLfloat) -> void --- - glGetFramebufferAttachmentParameteriv :: (target: GLenum, attachment: GLenum, pname: GLenum, params: ^GLint) -> void --- - glGetIntegerv :: (pname: GLenum, data: ^GLint) -> void --- - glGetProgramiv :: (program: GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetProgramInfoLog :: (program: GLuint, bufSize: GLsizei, length: ^GLsizei, infoLog: ^GLchar) -> void --- - glGetRenderbufferParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- - glGetShaderiv :: (shader: GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetShaderInfoLog :: (shader: GLuint, bufSize: GLsizei, length: ^GLsizei, infoLog: ^GLchar) -> void --- - glGetShaderPrecisionFormat :: (shadertype: GLenum, precisiontype: GLenum, range: ^GLint, precision: ^GLint) -> void --- - glGetShaderSource :: (shader: GLuint, bufSize: GLsizei, length: ^GLsizei, source: ^GLchar) -> void --- - glGetString :: (name: GLenum) -> cptr(GLubyte) --- - glGetTexParameterfv :: (target: GLenum, pname: GLenum, params: ^GLfloat) -> void --- - glGetTexParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- - glGetUniformfv :: (program: GLuint, location: GLint, params: ^GLfloat) -> void --- - glGetUniformiv :: (program: GLuint, location: GLint, params: ^GLint) -> void --- - glGetUniformLocation :: (program: GLuint, name: ^GLchar) -> GLint --- - glGetVertexAttribfv :: (index: GLuint, pname: GLenum, params: ^GLfloat) -> void --- - glGetVertexAttribiv :: (index: GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetVertexAttribPointerv :: (index: GLuint, pname: GLenum, pointer: ^rawptr) -> void --- - glHint :: (target: GLenum, mode: GLenum) -> void --- - glIsBuffer :: (buffer: GLuint) -> GLboolean --- - glIsEnabled :: (cap: GLenum) -> GLboolean --- - glIsFramebuffer :: (framebuffer: GLuint) -> GLboolean --- - glIsProgram :: (program: GLuint) -> GLboolean --- - glIsRenderbuffer :: (renderbuffer: GLuint) -> GLboolean --- - glIsShader :: (shader: GLuint) -> GLboolean --- - glIsTexture :: (texture: GLuint) -> GLboolean --- - glLineWidth :: (width: GLfloat) -> void --- - glLinkProgram :: (program: GLuint) -> void --- - glPixelStorei :: (pname: GLenum, param: GLint) -> void --- - glPolygonOffset :: (factor: GLfloat, units: GLfloat) -> void --- - glReadPixels :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: rawptr) -> void --- - glReleaseShaderCompiler :: () -> void --- - glRenderbufferStorage :: (target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- - glSampleCoverage :: (value: GLfloat, invert: GLboolean) -> void --- - glScissor :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- - glShaderBinary :: (count: GLsizei, shaders: ^GLuint, binaryformat: GLenum, binary: rawptr, length: GLsizei) -> void --- - glShaderSource :: (shader: GLuint, count: GLsizei, string: ^cptr(GLchar), length: ^GLint) -> void --- - glStencilFunc :: (func: GLenum, ref: GLint, mask: GLuint) -> void --- - glStencilFuncSeparate :: (face: GLenum, func: GLenum, ref: GLint, mask: GLuint) -> void --- - glStencilMask :: (mask: GLuint) -> void --- - glStencilMaskSeparate :: (face: GLenum, mask: GLuint) -> void --- - glStencilOp :: (fail: GLenum, zfail: GLenum, zpass: GLenum) -> void --- - glStencilOpSeparate :: (face: GLenum, sfail: GLenum, dpfail: GLenum, dppass: GLenum) -> void --- - glTexImage2D :: (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: rawptr) -> void --- - glTexParameterf :: (target: GLenum, pname: GLenum, param: GLfloat) -> void --- - glTexParameterfv :: (target: GLenum, pname: GLenum, params: ^GLfloat) -> void --- - glTexParameteri :: (target: GLenum, pname: GLenum, param: GLint) -> void --- - glTexParameteriv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- - glTexSubImage2D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: rawptr) -> void --- - glUniform1f :: (location: GLint, v0: GLfloat) -> void --- - glUniform1fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- - glUniform1i :: (location: GLint, v0: GLint) -> void --- - glUniform1iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- - glUniform2f :: (location: GLint, v0: GLfloat, v1: GLfloat) -> void --- - glUniform2fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- - glUniform2i :: (location: GLint, v0: GLint, v1: GLint) -> void --- - glUniform2iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- - glUniform3f :: (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat) -> void --- - glUniform3fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- - glUniform3i :: (location: GLint, v0: GLint, v1: GLint, v2: GLint) -> void --- - glUniform3iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- - glUniform4f :: (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat, v3: GLfloat) -> void --- - glUniform4fv :: (location: GLint, count: GLsizei, value: ^GLfloat) -> void --- - glUniform4i :: (location: GLint, v0: GLint, v1: GLint, v2: GLint, v3: GLint) -> void --- - glUniform4iv :: (location: GLint, count: GLsizei, value: ^GLint) -> void --- - glUniformMatrix2fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix3fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix4fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUseProgram :: (program: GLuint) -> void --- - glValidateProgram :: (program: GLuint) -> void --- - glVertexAttrib1f :: (index: GLuint, x: GLfloat) -> void --- - glVertexAttrib1fv :: (index: GLuint, v: ^GLfloat) -> void --- - glVertexAttrib2f :: (index: GLuint, x: GLfloat, y: GLfloat) -> void --- - glVertexAttrib2fv :: (index: GLuint, v: ^GLfloat) -> void --- - glVertexAttrib3f :: (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) -> void --- - glVertexAttrib3fv :: (index: GLuint, v: ^GLfloat) -> void --- - glVertexAttrib4f :: (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void --- - glVertexAttrib4fv :: (index: GLuint, v: ^GLfloat) -> void --- - glVertexAttribPointer :: (index: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, pointer: rawptr) -> void --- - glViewport :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- - - - // Open3: GLES - glReadBuffer :: (src: GLenum) -> void --- - glDrawRangeElements :: (mode: GLenum, start: GLuint, end: GLuint, count: GLsizei, type: GLenum, indices: rawptr) -> void --- - glTexImage3D :: (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: rawptr) -> void --- - glTexSubImage3D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, type: GLenum, pixels: rawptr) -> void --- - glCopyTexSubImage3D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- - glCompressedTexImage3D :: (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, data: rawptr) -> void --- - glCompressedTexSubImage3D :: (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, data: rawptr) -> void --- - glGenQueries :: (n: GLsizei, ids: ^GLuint) -> void --- - glDeleteQueries :: (n: GLsizei, ids: ^GLuint) -> void --- - glIsQuery :: (id: GLuint) -> GLboolean --- - glBeginQuery :: (target: GLenum, id: GLuint) -> void --- - glEndQuery :: (target: GLenum) -> void --- - glGetQueryiv :: (target: GLenum, pname: GLenum, params: ^GLint) -> void --- - glGetQueryObjectuiv :: (id: GLuint, pname: GLenum, params: ^GLuint) -> void --- - glUnmapBuffer :: (target: GLenum) -> GLboolean --- - glGetBufferPointerv :: (target: GLenum, pname: GLenum, params: ^rawptr) -> void --- - glDrawBuffers :: (n: GLsizei, bufs: ^GLenum) -> void --- - glUniformMatrix2x3fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix3x2fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix2x4fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix4x2fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix3x4fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glUniformMatrix4x3fv :: (location: GLint, count: GLsizei, transpose: GLboolean, value: ^GLfloat) -> void --- - glBlitFramebuffer :: (srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum) -> void --- - glRenderbufferStorageMultisample :: (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- - glFramebufferTextureLayer :: (target: GLenum, attachment: GLenum, texture: GLuint, level: GLint, layer: GLint) -> void --- - glMapBufferRange :: (target: GLenum, offset: GLintptr, length: GLsizeiptr, access: GLbitfield) -> rawptr --- - glFlushMappedBufferRange :: (target: GLenum, offset: GLintptr, length: GLsizeiptr) -> void --- - glBindVertexArray :: (array: GLint) -> void --- - glDeleteVertexArrays :: (n: GLsizei, arrays: ^GLuint) -> void --- - glGenVertexArrays :: (n: GLsizei, arrays: ^GLuint) -> void --- - glIsVertexArray :: (array: GLuint) -> GLboolean --- - glGetIntegeri_v :: (target: GLenum, index: GLuint, data: ^GLint) -> void --- - glBeginTransformFeedback :: (primitiveMode: GLenum) -> void --- - glEndTransformFeedback :: () -> void --- - glBindBufferRange :: (target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr) -> void --- - glBindBufferBase :: (target: GLenum, index: GLuint, buffer: GLuint) -> void --- - glTransformFeedbackVaryings :: (program: GLuint, count: GLsizei, varyings: ^^GLchar, bufferMode: GLenum) -> void --- - glGetTransformFeedbackVarying :: (program: GLuint, index: GLuint, bufSize: GLsizei, length: ^GLsizei, size: ^GLsizei, type: ^GLenum, name: ^GLchar) -> void --- - glVertexAttribIPointer :: (index: GLuint, size: GLint, type: GLenum, stride: GLsizei, pointer: rawptr) -> void --- - glGetVertexAttribIiv :: (index: GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetVertexAttribIuiv :: (index: GLuint, pname: GLenum, params: ^GLuint) -> void --- - glVertexAttribI4i :: (index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) -> void --- - glVertexAttribI4ui :: (index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) -> void --- - glVertexAttribI4iv :: (index: GLuint, v: ^GLint) -> void --- - glVertexAttribI4uiv :: (index: GLuint, v: ^GLuint) -> void --- - glGetUniformuiv :: (program: GLuint, location: GLint, params: ^GLuint) -> void --- - glGetFragDataLocation :: (program: GLuint, name: ^GLchar) -> GLint --- - glUniform1ui :: (location: GLint, v0: GLuint) -> void --- - glUniform2ui :: (location: GLint, v0: GLuint, v1: GLuint) -> void --- - glUniform3ui :: (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint) -> void --- - glUniform4ui :: (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint) -> void --- - glUniform1uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- - glUniform2uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- - glUniform3uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- - glUniform4uiv :: (location: GLint, count: GLsizei, value: ^GLuint) -> void --- - glClearBufferiv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLint) -> void --- - glClearBufferuiv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLuint) -> void --- - glClearBufferfv :: (buffer: GLenum, drawbuffer: GLint, value: ^GLfloat) -> void --- - glClearBufferfi :: (buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint) -> void --- - glGetStringi :: (name: GLenum, index: GLuint) -> cptr(GLubyte) --- - glCopyBufferSubData :: (readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) -> void --- - glGetUniformIndices :: (program: GLuint, uniformCount: GLsizei, uniformNames: ^cptr(GLchar), uniformIndices: ^GLuint) -> void --- - glGetActiveUniformsiv :: (program: GLuint, uniformCount: GLsizei, uniformIndices: ^GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetUniformBlockIndex :: (program: GLuint, uniformBlockName: ^GLchar) -> GLuint --- - glGetActiveUniformBlockiv :: (program: GLuint, uniformBlockIndex: GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetActiveUniformBlockName :: (program: GLuint, uniformBlockIndex: GLuint, bufSize: GLsizei, length: ^GLsizei, uniformBlockName: ^GLchar) -> void --- - glUniformBlockBinding :: (program: GLuint, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint) -> void --- - glDrawArraysInstanced :: (mode: GLenum, first: GLint, count: GLsizei, instancecount: GLsizei) -> void --- - glDrawElementsInstanced :: (mode: GLenum, count: GLsizei, type: GLenum, indices: rawptr, instancecount: GLsizei) -> void --- - // glFenceSync :: (condition: GLenum, flags: GLbitfield) -> GLsync --- - // glIsSync :: (sync: GLsync) -> GLboolean --- - // glDeleteSync :: (sync: GLsync) -> void --- - // glClientWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> GLenum --- - // glWaitSync :: (sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> void --- - glGetInteger64v :: (pname: GLenum, data: ^GLint64) -> void --- - // glGetSynciv :: (sync: GLsync, pname: GLenum, bufSize: GLsizei, length: ^GLsizei, values: ^GLint) -> void --- - glGetInteger64i_v :: (target: GLenum, index: GLuint, data: ^GLint64) -> void --- - glGetBufferParameteri64v :: (target: GLenum, pname: GLenum, params: ^GLint64) -> void --- - glGenSamplers :: (count: GLsizei, samplers: ^GLuint) -> void --- - glDeleteSamplers :: (count: GLsizei, samplers: ^GLuint) -> void --- - glIsSampler :: (sampler: GLuint) -> GLboolean --- - glBindSampler :: (unit: GLuint, sampler: GLuint) -> void --- - glSamplerParameteri :: (sampler: GLuint, pname: GLenum, param: GLint) -> void --- - glSamplerParameteriv :: (sampler: GLuint, pname: GLenum, param: ^GLint) -> void --- - glSamplerParameterf :: (sampler: GLuint, pname: GLenum, param: GLfloat) -> void --- - glSamplerParameterfv :: (sampler: GLuint, pname: GLenum, param: ^GLfloat) -> void --- - glGetSamplerParameteriv :: (sampler: GLuint, pname: GLenum, params: ^GLint) -> void --- - glGetSamplerParameterfv :: (sampler: GLuint, pname: GLenum, params: ^GLfloat) -> void --- - glVertexAttribDivisor :: (index: GLuint, divisor: GLuint) -> void --- - glBindTransformFeedback :: (target: GLenum, id: GLuint) -> void --- - glDeleteTransformFeedbacks :: (n: GLsizei, ids: ^GLuint) -> void --- - glGenTransformFeedbacks :: (n: GLsizei, ids: ^GLuint) -> void --- - glIsTransformFeedback :: (id: GLuint) -> GLboolean --- - glPauseTransformFeedback :: () -> void --- - glResumeTransformFeedback :: () -> void --- - glGetProgramBinary :: (program: GLuint, bufSize: GLsizei, length: ^GLsizei, binaryFormat: ^GLenum, binary: rawptr) -> void --- - glProgramBinary :: (program: GLuint, binaryFormat: GLenum, binary: rawptr, length: GLsizei) -> void --- - glProgramParameteri :: (program: GLuint, pname: GLenum, value: GLint) -> void --- - glInvalidateFramebuffer :: (target: GLenum, numAttachments: GLsizei, attachments: ^GLenum) -> void --- - glInvalidateSubFramebuffer :: (target: GLenum, numAttachments: GLsizei, attachments: ^GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void --- - glTexStorage2D :: (target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) -> void --- - glTexStorage3D :: (target: GLenum, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei) -> void --- - glGetInternalformativ :: (target: GLenum, internalformat: GLenum, pname: GLenum, bufSize: GLsizei, params: ^GLint) -> void --- -} - -GLbyte :: i8; -GLclampf :: f32; -GLfixed :: i32; -GLshort :: i16; -GLushort :: u16; -GLvoid :: void; -GLsync :: #distinct u64; -GLint64 :: i64; -GLuint64 :: u64; -GLenum :: i32; -GLuint :: u32; -GLchar :: u8; -GLfloat :: f32; -GLsizeiptr :: i32; -GLintptr:: i32; -GLbitfield :: u32; -GLint :: i32; -GLboolean :: bool; -GLsizei :: i32; -GLubyte :: u8; - -GL_DEPTH_BUFFER_BIT :: 0x00000100 -GL_STENCIL_BUFFER_BIT :: 0x00000400 -GL_COLOR_BUFFER_BIT :: 0x00004000 -GL_FALSE :: 0 -GL_TRUE :: 1 -GL_POINTS :: 0x0000 -GL_LINES :: 0x0001 -GL_LINE_LOOP :: 0x0002 -GL_LINE_STRIP :: 0x0003 -GL_TRIANGLES :: 0x0004 -GL_TRIANGLE_STRIP :: 0x0005 -GL_TRIANGLE_FAN :: 0x0006 -GL_ZERO :: 0 -GL_ONE :: 1 -GL_SRC_COLOR :: 0x0300 -GL_ONE_MINUS_SRC_COLOR :: 0x0301 -GL_SRC_ALPHA :: 0x0302 -GL_ONE_MINUS_SRC_ALPHA :: 0x0303 -GL_DST_ALPHA :: 0x0304 -GL_ONE_MINUS_DST_ALPHA :: 0x0305 -GL_DST_COLOR :: 0x0306 -GL_ONE_MINUS_DST_COLOR :: 0x0307 -GL_SRC_ALPHA_SATURATE :: 0x0308 -GL_FUNC_ADD :: 0x8006 -GL_BLEND_EQUATION :: 0x8009 -GL_BLEND_EQUATION_RGB :: 0x8009 -GL_BLEND_EQUATION_ALPHA :: 0x883D -GL_FUNC_SUBTRACT :: 0x800A -GL_FUNC_REVERSE_SUBTRACT :: 0x800B -GL_BLEND_DST_RGB :: 0x80C8 -GL_BLEND_SRC_RGB :: 0x80C9 -GL_BLEND_DST_ALPHA :: 0x80CA -GL_BLEND_SRC_ALPHA :: 0x80CB -GL_CONSTANT_COLOR :: 0x8001 -GL_ONE_MINUS_CONSTANT_COLOR :: 0x8002 -GL_CONSTANT_ALPHA :: 0x8003 -GL_ONE_MINUS_CONSTANT_ALPHA :: 0x8004 -GL_BLEND_COLOR :: 0x8005 -GL_ARRAY_BUFFER :: 0x8892 -GL_ELEMENT_ARRAY_BUFFER :: 0x8893 -GL_ARRAY_BUFFER_BINDING :: 0x8894 -GL_ELEMENT_ARRAY_BUFFER_BINDING :: 0x8895 -GL_STREAM_DRAW :: 0x88E0 -GL_STATIC_DRAW :: 0x88E4 -GL_DYNAMIC_DRAW :: 0x88E8 -GL_BUFFER_SIZE :: 0x8764 -GL_BUFFER_USAGE :: 0x8765 -GL_CURRENT_VERTEX_ATTRIB :: 0x8626 -GL_FRONT :: 0x0404 -GL_BACK :: 0x0405 -GL_FRONT_AND_BACK :: 0x0408 -GL_TEXTURE_2D :: 0x0DE1 -GL_CULL_FACE :: 0x0B44 -GL_BLEND :: 0x0BE2 -GL_DITHER :: 0x0BD0 -GL_STENCIL_TEST :: 0x0B90 -GL_DEPTH_TEST :: 0x0B71 -GL_SCISSOR_TEST :: 0x0C11 -GL_POLYGON_OFFSET_FILL :: 0x8037 -GL_SAMPLE_ALPHA_TO_COVERAGE :: 0x809E -GL_SAMPLE_COVERAGE :: 0x80A0 -GL_NO_ERROR :: 0 -GL_INVALID_ENUM :: 0x0500 -GL_INVALID_VALUE :: 0x0501 -GL_INVALID_OPERATION :: 0x0502 -GL_OUT_OF_MEMORY :: 0x0505 -GL_CW :: 0x0900 -GL_CCW :: 0x0901 -GL_LINE_WIDTH :: 0x0B21 -GL_ALIASED_POINT_SIZE_RANGE :: 0x846D -GL_ALIASED_LINE_WIDTH_RANGE :: 0x846E -GL_CULL_FACE_MODE :: 0x0B45 -GL_FRONT_FACE :: 0x0B46 -GL_DEPTH_RANGE :: 0x0B70 -GL_DEPTH_WRITEMASK :: 0x0B72 -GL_DEPTH_CLEAR_VALUE :: 0x0B73 -GL_DEPTH_FUNC :: 0x0B74 -GL_STENCIL_CLEAR_VALUE :: 0x0B91 -GL_STENCIL_FUNC :: 0x0B92 -GL_STENCIL_FAIL :: 0x0B94 -GL_STENCIL_PASS_DEPTH_FAIL :: 0x0B95 -GL_STENCIL_PASS_DEPTH_PASS :: 0x0B96 -GL_STENCIL_REF :: 0x0B97 -GL_STENCIL_VALUE_MASK :: 0x0B93 -GL_STENCIL_WRITEMASK :: 0x0B98 -GL_STENCIL_BACK_FUNC :: 0x8800 -GL_STENCIL_BACK_FAIL :: 0x8801 -GL_STENCIL_BACK_PASS_DEPTH_FAIL :: 0x8802 -GL_STENCIL_BACK_PASS_DEPTH_PASS :: 0x8803 -GL_STENCIL_BACK_REF :: 0x8CA3 -GL_STENCIL_BACK_VALUE_MASK :: 0x8CA4 -GL_STENCIL_BACK_WRITEMASK :: 0x8CA5 -GL_VIEWPORT :: 0x0BA2 -GL_SCISSOR_BOX :: 0x0C10 -GL_COLOR_CLEAR_VALUE :: 0x0C22 -GL_COLOR_WRITEMASK :: 0x0C23 -GL_UNPACK_ALIGNMENT :: 0x0CF5 -GL_PACK_ALIGNMENT :: 0x0D05 -GL_MAX_TEXTURE_SIZE :: 0x0D33 -GL_MAX_VIEWPORT_DIMS :: 0x0D3A -GL_SUBPIXEL_BITS :: 0x0D50 -GL_RED_BITS :: 0x0D52 -GL_GREEN_BITS :: 0x0D53 -GL_BLUE_BITS :: 0x0D54 -GL_ALPHA_BITS :: 0x0D55 -GL_DEPTH_BITS :: 0x0D56 -GL_STENCIL_BITS :: 0x0D57 -GL_POLYGON_OFFSET_UNITS :: 0x2A00 -GL_POLYGON_OFFSET_FACTOR :: 0x8038 -GL_TEXTURE_BINDING_2D :: 0x8069 -GL_SAMPLE_BUFFERS :: 0x80A8 -GL_SAMPLES :: 0x80A9 -GL_SAMPLE_COVERAGE_VALUE :: 0x80AA -GL_SAMPLE_COVERAGE_INVERT :: 0x80AB -GL_NUM_COMPRESSED_TEXTURE_FORMATS :: 0x86A2 -GL_COMPRESSED_TEXTURE_FORMATS :: 0x86A3 -GL_DONT_CARE :: 0x1100 -GL_FASTEST :: 0x1101 -GL_NICEST :: 0x1102 -GL_GENERATE_MIPMAP_HINT :: 0x8192 -GL_BYTE :: 0x1400 -GL_UNSIGNED_BYTE :: 0x1401 -GL_SHORT :: 0x1402 -GL_UNSIGNED_SHORT :: 0x1403 -GL_INT :: 0x1404 -GL_UNSIGNED_INT :: 0x1405 -GL_FLOAT :: 0x1406 -GL_FIXED :: 0x140C -GL_DEPTH_COMPONENT :: 0x1902 -GL_ALPHA :: 0x1906 -GL_RGB :: 0x1907 -GL_RGBA :: 0x1908 -GL_LUMINANCE :: 0x1909 -GL_LUMINANCE_ALPHA :: 0x190A -GL_UNSIGNED_SHORT_4_4_4_4 :: 0x8033 -GL_UNSIGNED_SHORT_5_5_5_1 :: 0x8034 -GL_UNSIGNED_SHORT_5_6_5 :: 0x8363 -GL_FRAGMENT_SHADER :: 0x8B30 -GL_VERTEX_SHADER :: 0x8B31 -GL_MAX_VERTEX_ATTRIBS :: 0x8869 -GL_MAX_VERTEX_UNIFORM_VECTORS :: 0x8DFB -GL_MAX_VARYING_VECTORS :: 0x8DFC -GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS :: 0x8B4D -GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS :: 0x8B4C -GL_MAX_TEXTURE_IMAGE_UNITS :: 0x8872 -GL_MAX_FRAGMENT_UNIFORM_VECTORS :: 0x8DFD -GL_SHADER_TYPE :: 0x8B4F -GL_DELETE_STATUS :: 0x8B80 -GL_LINK_STATUS :: 0x8B82 -GL_VALIDATE_STATUS :: 0x8B83 -GL_ATTACHED_SHADERS :: 0x8B85 -GL_ACTIVE_UNIFORMS :: 0x8B86 -GL_ACTIVE_UNIFORM_MAX_LENGTH :: 0x8B87 -GL_ACTIVE_ATTRIBUTES :: 0x8B89 -GL_ACTIVE_ATTRIBUTE_MAX_LENGTH :: 0x8B8A -GL_SHADING_LANGUAGE_VERSION :: 0x8B8C -GL_CURRENT_PROGRAM :: 0x8B8D -GL_NEVER :: 0x0200 -GL_LESS :: 0x0201 -GL_EQUAL :: 0x0202 -GL_LEQUAL :: 0x0203 -GL_GREATER :: 0x0204 -GL_NOTEQUAL :: 0x0205 -GL_GEQUAL :: 0x0206 -GL_ALWAYS :: 0x0207 -GL_KEEP :: 0x1E00 -GL_REPLACE :: 0x1E01 -GL_INCR :: 0x1E02 -GL_DECR :: 0x1E03 -GL_INVERT :: 0x150A -GL_INCR_WRAP :: 0x8507 -GL_DECR_WRAP :: 0x8508 -GL_VENDOR :: 0x1F00 -GL_RENDERER :: 0x1F01 -GL_VERSION :: 0x1F02 -GL_EXTENSIONS :: 0x1F03 -GL_NEAREST :: 0x2600 -GL_LINEAR :: 0x2601 -GL_NEAREST_MIPMAP_NEAREST :: 0x2700 -GL_LINEAR_MIPMAP_NEAREST :: 0x2701 -GL_NEAREST_MIPMAP_LINEAR :: 0x2702 -GL_LINEAR_MIPMAP_LINEAR :: 0x2703 -GL_TEXTURE_MAG_FILTER :: 0x2800 -GL_TEXTURE_MIN_FILTER :: 0x2801 -GL_TEXTURE_WRAP_S :: 0x2802 -GL_TEXTURE_WRAP_T :: 0x2803 -GL_TEXTURE :: 0x1702 -GL_TEXTURE_CUBE_MAP :: 0x8513 -GL_TEXTURE_BINDING_CUBE_MAP :: 0x8514 -GL_TEXTURE_CUBE_MAP_POSITIVE_X :: 0x8515 -GL_TEXTURE_CUBE_MAP_NEGATIVE_X :: 0x8516 -GL_TEXTURE_CUBE_MAP_POSITIVE_Y :: 0x8517 -GL_TEXTURE_CUBE_MAP_NEGATIVE_Y :: 0x8518 -GL_TEXTURE_CUBE_MAP_POSITIVE_Z :: 0x8519 -GL_TEXTURE_CUBE_MAP_NEGATIVE_Z :: 0x851A -GL_MAX_CUBE_MAP_TEXTURE_SIZE :: 0x851C -GL_TEXTURE0 :: 0x84C0 -GL_TEXTURE1 :: 0x84C1 -GL_TEXTURE2 :: 0x84C2 -GL_TEXTURE3 :: 0x84C3 -GL_TEXTURE4 :: 0x84C4 -GL_TEXTURE5 :: 0x84C5 -GL_TEXTURE6 :: 0x84C6 -GL_TEXTURE7 :: 0x84C7 -GL_TEXTURE8 :: 0x84C8 -GL_TEXTURE9 :: 0x84C9 -GL_TEXTURE10 :: 0x84CA -GL_TEXTURE11 :: 0x84CB -GL_TEXTURE12 :: 0x84CC -GL_TEXTURE13 :: 0x84CD -GL_TEXTURE14 :: 0x84CE -GL_TEXTURE15 :: 0x84CF -GL_TEXTURE16 :: 0x84D0 -GL_TEXTURE17 :: 0x84D1 -GL_TEXTURE18 :: 0x84D2 -GL_TEXTURE19 :: 0x84D3 -GL_TEXTURE20 :: 0x84D4 -GL_TEXTURE21 :: 0x84D5 -GL_TEXTURE22 :: 0x84D6 -GL_TEXTURE23 :: 0x84D7 -GL_TEXTURE24 :: 0x84D8 -GL_TEXTURE25 :: 0x84D9 -GL_TEXTURE26 :: 0x84DA -GL_TEXTURE27 :: 0x84DB -GL_TEXTURE28 :: 0x84DC -GL_TEXTURE29 :: 0x84DD -GL_TEXTURE30 :: 0x84DE -GL_TEXTURE31 :: 0x84DF -GL_ACTIVE_TEXTURE :: 0x84E0 -GL_REPEAT :: 0x2901 -GL_CLAMP_TO_EDGE :: 0x812F -GL_MIRRORED_REPEAT :: 0x8370 -GL_FLOAT_VEC2 :: 0x8B50 -GL_FLOAT_VEC3 :: 0x8B51 -GL_FLOAT_VEC4 :: 0x8B52 -GL_INT_VEC2 :: 0x8B53 -GL_INT_VEC3 :: 0x8B54 -GL_INT_VEC4 :: 0x8B55 -GL_BOOL :: 0x8B56 -GL_BOOL_VEC2 :: 0x8B57 -GL_BOOL_VEC3 :: 0x8B58 -GL_BOOL_VEC4 :: 0x8B59 -GL_FLOAT_MAT2 :: 0x8B5A -GL_FLOAT_MAT3 :: 0x8B5B -GL_FLOAT_MAT4 :: 0x8B5C -GL_SAMPLER_2D :: 0x8B5E -GL_SAMPLER_CUBE :: 0x8B60 -GL_VERTEX_ATTRIB_ARRAY_ENABLED :: 0x8622 -GL_VERTEX_ATTRIB_ARRAY_SIZE :: 0x8623 -GL_VERTEX_ATTRIB_ARRAY_STRIDE :: 0x8624 -GL_VERTEX_ATTRIB_ARRAY_TYPE :: 0x8625 -GL_VERTEX_ATTRIB_ARRAY_NORMALIZED :: 0x886A -GL_VERTEX_ATTRIB_ARRAY_POINTER :: 0x8645 -GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING :: 0x889F -GL_IMPLEMENTATION_COLOR_READ_TYPE :: 0x8B9A -GL_IMPLEMENTATION_COLOR_READ_FORMAT :: 0x8B9B -GL_COMPILE_STATUS :: 0x8B81 -GL_INFO_LOG_LENGTH :: 0x8B84 -GL_SHADER_SOURCE_LENGTH :: 0x8B88 -GL_SHADER_COMPILER :: 0x8DFA -GL_SHADER_BINARY_FORMATS :: 0x8DF8 -GL_NUM_SHADER_BINARY_FORMATS :: 0x8DF9 -GL_LOW_FLOAT :: 0x8DF0 -GL_MEDIUM_FLOAT :: 0x8DF1 -GL_HIGH_FLOAT :: 0x8DF2 -GL_LOW_INT :: 0x8DF3 -GL_MEDIUM_INT :: 0x8DF4 -GL_HIGH_INT :: 0x8DF5 -GL_FRAMEBUFFER :: 0x8D40 -GL_RENDERBUFFER :: 0x8D41 -GL_RGBA4 :: 0x8056 -GL_RGB5_A1 :: 0x8057 -GL_RGB565 :: 0x8D62 -GL_DEPTH_COMPONENT16 :: 0x81A5 -GL_STENCIL_INDEX8 :: 0x8D48 -GL_RENDERBUFFER_WIDTH :: 0x8D42 -GL_RENDERBUFFER_HEIGHT :: 0x8D43 -GL_RENDERBUFFER_INTERNAL_FORMAT :: 0x8D44 -GL_RENDERBUFFER_RED_SIZE :: 0x8D50 -GL_RENDERBUFFER_GREEN_SIZE :: 0x8D51 -GL_RENDERBUFFER_BLUE_SIZE :: 0x8D52 -GL_RENDERBUFFER_ALPHA_SIZE :: 0x8D53 -GL_RENDERBUFFER_DEPTH_SIZE :: 0x8D54 -GL_RENDERBUFFER_STENCIL_SIZE :: 0x8D55 -GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE :: 0x8CD0 -GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME :: 0x8CD1 -GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL :: 0x8CD2 -GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE :: 0x8CD3 -GL_COLOR_ATTACHMENT0 :: 0x8CE0 -GL_DEPTH_ATTACHMENT :: 0x8D00 -GL_STENCIL_ATTACHMENT :: 0x8D20 -GL_NONE :: 0 -GL_FRAMEBUFFER_COMPLETE :: 0x8CD5 -GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT :: 0x8CD6 -GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :: 0x8CD7 -GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS :: 0x8CD9 -GL_FRAMEBUFFER_UNSUPPORTED :: 0x8CDD -GL_FRAMEBUFFER_BINDING :: 0x8CA6 -GL_RENDERBUFFER_BINDING :: 0x8CA7 -GL_MAX_RENDERBUFFER_SIZE :: 0x84E8 -GL_INVALID_FRAMEBUFFER_OPERATION :: 0x0506 -GL_READ_BUFFER :: 0x0C02 -GL_UNPACK_ROW_LENGTH :: 0x0CF2 -GL_UNPACK_SKIP_ROWS :: 0x0CF3 -GL_UNPACK_SKIP_PIXELS :: 0x0CF4 -GL_PACK_ROW_LENGTH :: 0x0D02 -GL_PACK_SKIP_ROWS :: 0x0D03 -GL_PACK_SKIP_PIXELS :: 0x0D04 -GL_COLOR :: 0x1800 -GL_DEPTH :: 0x1801 -GL_STENCIL :: 0x1802 -GL_RED :: 0x1903 -GL_RGB8 :: 0x8051 -GL_RGBA8 :: 0x8058 -GL_RGB10_A2 :: 0x8059 -GL_TEXTURE_BINDING_3D :: 0x806A -GL_UNPACK_SKIP_IMAGES :: 0x806D -GL_UNPACK_IMAGE_HEIGHT :: 0x806E -GL_TEXTURE_3D :: 0x806F -GL_TEXTURE_WRAP_R :: 0x8072 -GL_MAX_3D_TEXTURE_SIZE :: 0x8073 -GL_UNSIGNED_INT_2_10_10_10_REV :: 0x8368 -GL_MAX_ELEMENTS_VERTICES :: 0x80E8 -GL_MAX_ELEMENTS_INDICES :: 0x80E9 -GL_TEXTURE_MIN_LOD :: 0x813A -GL_TEXTURE_MAX_LOD :: 0x813B -GL_TEXTURE_BASE_LEVEL :: 0x813C -GL_TEXTURE_MAX_LEVEL :: 0x813D -GL_MIN :: 0x8007 -GL_MAX :: 0x8008 -GL_DEPTH_COMPONENT24 :: 0x81A6 -GL_MAX_TEXTURE_LOD_BIAS :: 0x84FD -GL_TEXTURE_COMPARE_MODE :: 0x884C -GL_TEXTURE_COMPARE_FUNC :: 0x884D -GL_CURRENT_QUERY :: 0x8865 -GL_QUERY_RESULT :: 0x8866 -GL_QUERY_RESULT_AVAILABLE :: 0x8867 -GL_BUFFER_MAPPED :: 0x88BC -GL_BUFFER_MAP_POINTER :: 0x88BD -GL_STREAM_READ :: 0x88E1 -GL_STREAM_COPY :: 0x88E2 -GL_STATIC_READ :: 0x88E5 -GL_STATIC_COPY :: 0x88E6 -GL_DYNAMIC_READ :: 0x88E9 -GL_DYNAMIC_COPY :: 0x88EA -GL_MAX_DRAW_BUFFERS :: 0x8824 -GL_DRAW_BUFFER0 :: 0x8825 -GL_DRAW_BUFFER1 :: 0x8826 -GL_DRAW_BUFFER2 :: 0x8827 -GL_DRAW_BUFFER3 :: 0x8828 -GL_DRAW_BUFFER4 :: 0x8829 -GL_DRAW_BUFFER5 :: 0x882A -GL_DRAW_BUFFER6 :: 0x882B -GL_DRAW_BUFFER7 :: 0x882C -GL_DRAW_BUFFER8 :: 0x882D -GL_DRAW_BUFFER9 :: 0x882E -GL_DRAW_BUFFER10 :: 0x882F -GL_DRAW_BUFFER11 :: 0x8830 -GL_DRAW_BUFFER12 :: 0x8831 -GL_DRAW_BUFFER13 :: 0x8832 -GL_DRAW_BUFFER14 :: 0x8833 -GL_DRAW_BUFFER15 :: 0x8834 -GL_MAX_FRAGMENT_UNIFORM_COMPONENTS :: 0x8B49 -GL_MAX_VERTEX_UNIFORM_COMPONENTS :: 0x8B4A -GL_SAMPLER_3D :: 0x8B5F -GL_SAMPLER_2D_SHADOW :: 0x8B62 -GL_FRAGMENT_SHADER_DERIVATIVE_HINT :: 0x8B8B -GL_PIXEL_PACK_BUFFER :: 0x88EB -GL_PIXEL_UNPACK_BUFFER :: 0x88EC -GL_PIXEL_PACK_BUFFER_BINDING :: 0x88ED -GL_PIXEL_UNPACK_BUFFER_BINDING :: 0x88EF -GL_FLOAT_MAT2x3 :: 0x8B65 -GL_FLOAT_MAT2x4 :: 0x8B66 -GL_FLOAT_MAT3x2 :: 0x8B67 -GL_FLOAT_MAT3x4 :: 0x8B68 -GL_FLOAT_MAT4x2 :: 0x8B69 -GL_FLOAT_MAT4x3 :: 0x8B6A -GL_SRGB :: 0x8C40 -GL_SRGB8 :: 0x8C41 -GL_SRGB8_ALPHA8 :: 0x8C43 -GL_COMPARE_REF_TO_TEXTURE :: 0x884E -GL_MAJOR_VERSION :: 0x821B -GL_MINOR_VERSION :: 0x821C -GL_NUM_EXTENSIONS :: 0x821D -GL_RGBA32F :: 0x8814 -GL_RGB32F :: 0x8815 -GL_RGBA16F :: 0x881A -GL_RGB16F :: 0x881B -GL_VERTEX_ATTRIB_ARRAY_INTEGER :: 0x88FD -GL_MAX_ARRAY_TEXTURE_LAYERS :: 0x88FF -GL_MIN_PROGRAM_TEXEL_OFFSET :: 0x8904 -GL_MAX_PROGRAM_TEXEL_OFFSET :: 0x8905 -GL_MAX_VARYING_COMPONENTS :: 0x8B4B -GL_TEXTURE_2D_ARRAY :: 0x8C1A -GL_TEXTURE_BINDING_2D_ARRAY :: 0x8C1D -GL_R11F_G11F_B10F :: 0x8C3A -GL_UNSIGNED_INT_10F_11F_11F_REV :: 0x8C3B -GL_RGB9_E5 :: 0x8C3D -GL_UNSIGNED_INT_5_9_9_9_REV :: 0x8C3E -GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH :: 0x8C76 -GL_TRANSFORM_FEEDBACK_BUFFER_MODE :: 0x8C7F -GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS :: 0x8C80 -GL_TRANSFORM_FEEDBACK_VARYINGS :: 0x8C83 -GL_TRANSFORM_FEEDBACK_BUFFER_START :: 0x8C84 -GL_TRANSFORM_FEEDBACK_BUFFER_SIZE :: 0x8C85 -GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN :: 0x8C88 -GL_RASTERIZER_DISCARD :: 0x8C89 -GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS :: 0x8C8A -GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS :: 0x8C8B -GL_INTERLEAVED_ATTRIBS :: 0x8C8C -GL_SEPARATE_ATTRIBS :: 0x8C8D -GL_TRANSFORM_FEEDBACK_BUFFER :: 0x8C8E -GL_TRANSFORM_FEEDBACK_BUFFER_BINDING :: 0x8C8F -GL_RGBA32UI :: 0x8D70 -GL_RGB32UI :: 0x8D71 -GL_RGBA16UI :: 0x8D76 -GL_RGB16UI :: 0x8D77 -GL_RGBA8UI :: 0x8D7C -GL_RGB8UI :: 0x8D7D -GL_RGBA32I :: 0x8D82 -GL_RGB32I :: 0x8D83 -GL_RGBA16I :: 0x8D88 -GL_RGB16I :: 0x8D89 -GL_RGBA8I :: 0x8D8E -GL_RGB8I :: 0x8D8F -GL_RED_INTEGER :: 0x8D94 -GL_RGB_INTEGER :: 0x8D98 -GL_RGBA_INTEGER :: 0x8D99 -GL_SAMPLER_2D_ARRAY :: 0x8DC1 -GL_SAMPLER_2D_ARRAY_SHADOW :: 0x8DC4 -GL_SAMPLER_CUBE_SHADOW :: 0x8DC5 -GL_UNSIGNED_INT_VEC2 :: 0x8DC6 -GL_UNSIGNED_INT_VEC3 :: 0x8DC7 -GL_UNSIGNED_INT_VEC4 :: 0x8DC8 -GL_INT_SAMPLER_2D :: 0x8DCA -GL_INT_SAMPLER_3D :: 0x8DCB -GL_INT_SAMPLER_CUBE :: 0x8DCC -GL_INT_SAMPLER_2D_ARRAY :: 0x8DCF -GL_UNSIGNED_INT_SAMPLER_2D :: 0x8DD2 -GL_UNSIGNED_INT_SAMPLER_3D :: 0x8DD3 -GL_UNSIGNED_INT_SAMPLER_CUBE :: 0x8DD4 -GL_UNSIGNED_INT_SAMPLER_2D_ARRAY :: 0x8DD7 -GL_BUFFER_ACCESS_FLAGS :: 0x911F -GL_BUFFER_MAP_LENGTH :: 0x9120 -GL_BUFFER_MAP_OFFSET :: 0x9121 -GL_DEPTH_COMPONENT32F :: 0x8CAC -GL_DEPTH32F_STENCIL8 :: 0x8CAD -GL_FLOAT_32_UNSIGNED_INT_24_8_REV :: 0x8DAD -GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING :: 0x8210 -GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE :: 0x8211 -GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE :: 0x8212 -GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE :: 0x8213 -GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE :: 0x8214 -GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE :: 0x8215 -GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE :: 0x8216 -GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE :: 0x8217 -GL_FRAMEBUFFER_DEFAULT :: 0x8218 -GL_FRAMEBUFFER_UNDEFINED :: 0x8219 -GL_DEPTH_STENCIL_ATTACHMENT :: 0x821A -GL_DEPTH_STENCIL :: 0x84F9 -GL_UNSIGNED_INT_24_8 :: 0x84FA -GL_DEPTH24_STENCIL8 :: 0x88F0 -GL_UNSIGNED_NORMALIZED :: 0x8C17 -GL_DRAW_FRAMEBUFFER_BINDING :: 0x8CA6 -GL_READ_FRAMEBUFFER :: 0x8CA8 -GL_DRAW_FRAMEBUFFER :: 0x8CA9 -GL_READ_FRAMEBUFFER_BINDING :: 0x8CAA -GL_RENDERBUFFER_SAMPLES :: 0x8CAB -GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER :: 0x8CD4 -GL_MAX_COLOR_ATTACHMENTS :: 0x8CDF -GL_COLOR_ATTACHMENT1 :: 0x8CE1 -GL_COLOR_ATTACHMENT2 :: 0x8CE2 -GL_COLOR_ATTACHMENT3 :: 0x8CE3 -GL_COLOR_ATTACHMENT4 :: 0x8CE4 -GL_COLOR_ATTACHMENT5 :: 0x8CE5 -GL_COLOR_ATTACHMENT6 :: 0x8CE6 -GL_COLOR_ATTACHMENT7 :: 0x8CE7 -GL_COLOR_ATTACHMENT8 :: 0x8CE8 -GL_COLOR_ATTACHMENT9 :: 0x8CE9 -GL_COLOR_ATTACHMENT10 :: 0x8CEA -GL_COLOR_ATTACHMENT11 :: 0x8CEB -GL_COLOR_ATTACHMENT12 :: 0x8CEC -GL_COLOR_ATTACHMENT13 :: 0x8CED -GL_COLOR_ATTACHMENT14 :: 0x8CEE -GL_COLOR_ATTACHMENT15 :: 0x8CEF -GL_COLOR_ATTACHMENT16 :: 0x8CF0 -GL_COLOR_ATTACHMENT17 :: 0x8CF1 -GL_COLOR_ATTACHMENT18 :: 0x8CF2 -GL_COLOR_ATTACHMENT19 :: 0x8CF3 -GL_COLOR_ATTACHMENT20 :: 0x8CF4 -GL_COLOR_ATTACHMENT21 :: 0x8CF5 -GL_COLOR_ATTACHMENT22 :: 0x8CF6 -GL_COLOR_ATTACHMENT23 :: 0x8CF7 -GL_COLOR_ATTACHMENT24 :: 0x8CF8 -GL_COLOR_ATTACHMENT25 :: 0x8CF9 -GL_COLOR_ATTACHMENT26 :: 0x8CFA -GL_COLOR_ATTACHMENT27 :: 0x8CFB -GL_COLOR_ATTACHMENT28 :: 0x8CFC -GL_COLOR_ATTACHMENT29 :: 0x8CFD -GL_COLOR_ATTACHMENT30 :: 0x8CFE -GL_COLOR_ATTACHMENT31 :: 0x8CFF -GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :: 0x8D56 -GL_MAX_SAMPLES :: 0x8D57 -GL_HALF_FLOAT :: 0x140B -GL_MAP_READ_BIT :: 0x0001 -GL_MAP_WRITE_BIT :: 0x0002 -GL_MAP_INVALIDATE_RANGE_BIT :: 0x0004 -GL_MAP_INVALIDATE_BUFFER_BIT :: 0x0008 -GL_MAP_FLUSH_EXPLICIT_BIT :: 0x0010 -GL_MAP_UNSYNCHRONIZED_BIT :: 0x0020 -GL_RG :: 0x8227 -GL_RG_INTEGER :: 0x8228 -GL_R8 :: 0x8229 -GL_RG8 :: 0x822B -GL_R16F :: 0x822D -GL_R32F :: 0x822E -GL_RG16F :: 0x822F -GL_RG32F :: 0x8230 -GL_R8I :: 0x8231 -GL_R8UI :: 0x8232 -GL_R16I :: 0x8233 -GL_R16UI :: 0x8234 -GL_R32I :: 0x8235 -GL_R32UI :: 0x8236 -GL_RG8I :: 0x8237 -GL_RG8UI :: 0x8238 -GL_RG16I :: 0x8239 -GL_RG16UI :: 0x823A -GL_RG32I :: 0x823B -GL_RG32UI :: 0x823C -GL_VERTEX_ARRAY_BINDING :: 0x85B5 -GL_R8_SNORM :: 0x8F94 -GL_RG8_SNORM :: 0x8F95 -GL_RGB8_SNORM :: 0x8F96 -GL_RGBA8_SNORM :: 0x8F97 -GL_SIGNED_NORMALIZED :: 0x8F9C -GL_PRIMITIVE_RESTART_FIXED_INDEX :: 0x8D69 -GL_COPY_READ_BUFFER :: 0x8F36 -GL_COPY_WRITE_BUFFER :: 0x8F37 -GL_COPY_READ_BUFFER_BINDING :: 0x8F36 -GL_COPY_WRITE_BUFFER_BINDING :: 0x8F37 -GL_UNIFORM_BUFFER :: 0x8A11 -GL_UNIFORM_BUFFER_BINDING :: 0x8A28 -GL_UNIFORM_BUFFER_START :: 0x8A29 -GL_UNIFORM_BUFFER_SIZE :: 0x8A2A -GL_MAX_VERTEX_UNIFORM_BLOCKS :: 0x8A2B -GL_MAX_FRAGMENT_UNIFORM_BLOCKS :: 0x8A2D -GL_MAX_COMBINED_UNIFORM_BLOCKS :: 0x8A2E -GL_MAX_UNIFORM_BUFFER_BINDINGS :: 0x8A2F -GL_MAX_UNIFORM_BLOCK_SIZE :: 0x8A30 -GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS :: 0x8A31 -GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS :: 0x8A33 -GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT :: 0x8A34 -GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH :: 0x8A35 -GL_ACTIVE_UNIFORM_BLOCKS :: 0x8A36 -GL_UNIFORM_TYPE :: 0x8A37 -GL_UNIFORM_SIZE :: 0x8A38 -GL_UNIFORM_NAME_LENGTH :: 0x8A39 -GL_UNIFORM_BLOCK_INDEX :: 0x8A3A -GL_UNIFORM_OFFSET :: 0x8A3B -GL_UNIFORM_ARRAY_STRIDE :: 0x8A3C -GL_UNIFORM_MATRIX_STRIDE :: 0x8A3D -GL_UNIFORM_IS_ROW_MAJOR :: 0x8A3E -GL_UNIFORM_BLOCK_BINDING :: 0x8A3F -GL_UNIFORM_BLOCK_DATA_SIZE :: 0x8A40 -GL_UNIFORM_BLOCK_NAME_LENGTH :: 0x8A41 -GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS :: 0x8A42 -GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES :: 0x8A43 -GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER :: 0x8A44 -GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER :: 0x8A46 -GL_INVALID_INDEX :: 0xFFFFFFFF -GL_MAX_VERTEX_OUTPUT_COMPONENTS :: 0x9122 -GL_MAX_FRAGMENT_INPUT_COMPONENTS :: 0x9125 -GL_MAX_SERVER_WAIT_TIMEOUT :: 0x9111 -GL_OBJECT_TYPE :: 0x9112 -GL_SYNC_CONDITION :: 0x9113 -GL_SYNC_STATUS :: 0x9114 -GL_SYNC_FLAGS :: 0x9115 -GL_SYNC_FENCE :: 0x9116 -GL_SYNC_GPU_COMMANDS_COMPLETE :: 0x9117 -GL_UNSIGNALED :: 0x9118 -GL_SIGNALED :: 0x9119 -GL_ALREADY_SIGNALED :: 0x911A -GL_TIMEOUT_EXPIRED :: 0x911B -GL_CONDITION_SATISFIED :: 0x911C -GL_WAIT_FAILED :: 0x911D -GL_SYNC_FLUSH_COMMANDS_BIT :: 0x00000001 -GL_TIMEOUT_IGNORED :: 0xFFFFFFFFFFFFFFFF -GL_VERTEX_ATTRIB_ARRAY_DIVISOR :: 0x88FE -GL_ANY_SAMPLES_PASSED :: 0x8C2F -GL_ANY_SAMPLES_PASSED_CONSERVATIVE :: 0x8D6A -GL_SAMPLER_BINDING :: 0x8919 -GL_RGB10_A2UI :: 0x906F -GL_TEXTURE_SWIZZLE_R :: 0x8E42 -GL_TEXTURE_SWIZZLE_G :: 0x8E43 -GL_TEXTURE_SWIZZLE_B :: 0x8E44 -GL_TEXTURE_SWIZZLE_A :: 0x8E45 -GL_GREEN :: 0x1904 -GL_BLUE :: 0x1905 -GL_INT_2_10_10_10_REV :: 0x8D9F -GL_TRANSFORM_FEEDBACK :: 0x8E22 -GL_TRANSFORM_FEEDBACK_PAUSED :: 0x8E23 -GL_TRANSFORM_FEEDBACK_ACTIVE :: 0x8E24 -GL_TRANSFORM_FEEDBACK_BINDING :: 0x8E25 -GL_PROGRAM_BINARY_RETRIEVABLE_HINT :: 0x8257 -GL_PROGRAM_BINARY_LENGTH :: 0x8741 -GL_NUM_PROGRAM_BINARY_FORMATS :: 0x87FE -GL_PROGRAM_BINARY_FORMATS :: 0x87FF -GL_COMPRESSED_R11_EAC :: 0x9270 -GL_COMPRESSED_SIGNED_R11_EAC :: 0x9271 -GL_COMPRESSED_RG11_EAC :: 0x9272 -GL_COMPRESSED_SIGNED_RG11_EAC :: 0x9273 -GL_COMPRESSED_RGB8_ETC2 :: 0x9274 -GL_COMPRESSED_SRGB8_ETC2 :: 0x9275 -GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9276 -GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9277 -GL_COMPRESSED_RGBA8_ETC2_EAC :: 0x9278 -GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC :: 0x9279 -GL_TEXTURE_IMMUTABLE_FORMAT :: 0x912F -GL_MAX_ELEMENT_INDEX :: 0x8D6B -GL_NUM_SAMPLE_COUNTS :: 0x9380 -GL_TEXTURE_IMMUTABLE_LEVELS :: 0x82DF diff --git a/modules/opengles/onyx_opengles.so b/modules/opengles/onyx_opengles.so deleted file mode 100755 index 59deebe8..00000000 Binary files a/modules/opengles/onyx_opengles.so and /dev/null differ diff --git a/modules/opengles/opengles.c b/modules/opengles/opengles.c deleted file mode 100644 index c3261a92..00000000 --- a/modules/opengles/opengles.c +++ /dev/null @@ -1,1466 +0,0 @@ -// -// THIS FILE WAS AUTOMATICALLY GENERATED. -// - -#define GLAD_GLES2_IMPLEMENTATION -#include "glad.h" - - -#define ONYX_LIBRARY_NAME onyx_opengles -#include "onyx_library.h" - -#define P(i, k) (params->data[i].of.k) - - -ONYX_DEF(glInit, (LONG), ()) { - GLADloadfunc load_sym = (GLADloadfunc) params->data[0].of.i64; - gladLoadGLES2(load_sym); - return NULL; -} - -ONYX_DEF(glActiveTexture, (WASM_I32), ()) { - glad_glActiveTexture(P(0, i32)); - return NULL; -} - -ONYX_DEF(glAttachShader, (WASM_I32, WASM_I32), ()) { - glad_glAttachShader(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBindAttribLocation, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBindAttribLocation(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glBindBuffer, (WASM_I32, WASM_I32), ()) { - glad_glBindBuffer(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBindFramebuffer, (WASM_I32, WASM_I32), ()) { - glad_glBindFramebuffer(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBindRenderbuffer, (WASM_I32, WASM_I32), ()) { - glad_glBindRenderbuffer(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBindTexture, (WASM_I32, WASM_I32), ()) { - glad_glBindTexture(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBlendColor, (WASM_F32, WASM_F32, WASM_F32, WASM_F32), ()) { - glad_glBlendColor(P(0, f32), P(1, f32), P(2, f32), P(3, f32)); - return NULL; -} - -ONYX_DEF(glBlendEquation, (WASM_I32), ()) { - glad_glBlendEquation(P(0, i32)); - return NULL; -} - -ONYX_DEF(glBlendEquationSeparate, (WASM_I32, WASM_I32), ()) { - glad_glBlendEquationSeparate(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBlendFunc, (WASM_I32, WASM_I32), ()) { - glad_glBlendFunc(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBlendFuncSeparate, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBlendFuncSeparate(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glBufferData, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBufferData(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32)); - return NULL; -} - -ONYX_DEF(glBufferSubData, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBufferSubData(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glCheckFramebufferStatus, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glCheckFramebufferStatus(P(0, i32))); - return NULL; -} - -ONYX_DEF(glClear, (WASM_I32), ()) { - glad_glClear(P(0, i32)); - return NULL; -} - -ONYX_DEF(glClearColor, (WASM_F32, WASM_F32, WASM_F32, WASM_F32), ()) { - glad_glClearColor(P(0, f32), P(1, f32), P(2, f32), P(3, f32)); - return NULL; -} - -ONYX_DEF(glClearDepthf, (WASM_F32), ()) { - glad_glClearDepthf(P(0, f32)); - return NULL; -} - -ONYX_DEF(glClearStencil, (WASM_I32), ()) { - glad_glClearStencil(P(0, i32)); - return NULL; -} - -ONYX_DEF(glColorMask, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glColorMask(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glCompileShader, (WASM_I32), ()) { - glad_glCompileShader(P(0, i32)); - return NULL; -} - -ONYX_DEF(glCompressedTexImage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCompressedTexImage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), ONYX_PTR(P(7, i32))); - return NULL; -} - -ONYX_DEF(glCompressedTexSubImage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCompressedTexSubImage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), ONYX_PTR(P(8, i32))); - return NULL; -} - -ONYX_DEF(glCopyTexImage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCopyTexImage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32)); - return NULL; -} - -ONYX_DEF(glCopyTexSubImage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCopyTexSubImage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32)); - return NULL; -} - -ONYX_DEF(glCreateProgram, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glCreateProgram()); - return NULL; -} - -ONYX_DEF(glCreateShader, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glCreateShader(P(0, i32))); - return NULL; -} - -ONYX_DEF(glCullFace, (WASM_I32), ()) { - glad_glCullFace(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDeleteBuffers, (WASM_I32, WASM_I32), ()) { - glad_glDeleteBuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glDeleteFramebuffers, (WASM_I32, WASM_I32), ()) { - glad_glDeleteFramebuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glDeleteProgram, (WASM_I32), ()) { - glad_glDeleteProgram(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDeleteRenderbuffers, (WASM_I32, WASM_I32), ()) { - glad_glDeleteRenderbuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glDeleteShader, (WASM_I32), ()) { - glad_glDeleteShader(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDeleteTextures, (WASM_I32, WASM_I32), ()) { - glad_glDeleteTextures(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glDepthFunc, (WASM_I32), ()) { - glad_glDepthFunc(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDepthMask, (WASM_I32), ()) { - glad_glDepthMask(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDepthRangef, (WASM_F32, WASM_F32), ()) { - glad_glDepthRangef(P(0, f32), P(1, f32)); - return NULL; -} - -ONYX_DEF(glDetachShader, (WASM_I32, WASM_I32), ()) { - glad_glDetachShader(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glDisable, (WASM_I32), ()) { - glad_glDisable(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDisableVertexAttribArray, (WASM_I32), ()) { - glad_glDisableVertexAttribArray(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDrawArrays, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glDrawArrays(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glDrawElements, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glDrawElements(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glEnable, (WASM_I32), ()) { - glad_glEnable(P(0, i32)); - return NULL; -} - -ONYX_DEF(glEnableVertexAttribArray, (WASM_I32), ()) { - glad_glEnableVertexAttribArray(P(0, i32)); - return NULL; -} - -ONYX_DEF(glFinish, (), ()) { - glad_glFinish(); - return NULL; -} - -ONYX_DEF(glFlush, (), ()) { - glad_glFlush(); - return NULL; -} - -ONYX_DEF(glFramebufferRenderbuffer, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glFramebufferRenderbuffer(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glFramebufferTexture2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glFramebufferTexture2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glFrontFace, (WASM_I32), ()) { - glad_glFrontFace(P(0, i32)); - return NULL; -} - -ONYX_DEF(glGenBuffers, (WASM_I32, WASM_I32), ()) { - glad_glGenBuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGenerateMipmap, (WASM_I32), ()) { - glad_glGenerateMipmap(P(0, i32)); - return NULL; -} - -ONYX_DEF(glGenFramebuffers, (WASM_I32, WASM_I32), ()) { - glad_glGenFramebuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGenRenderbuffers, (WASM_I32, WASM_I32), ()) { - glad_glGenRenderbuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGenTextures, (WASM_I32, WASM_I32), ()) { - glad_glGenTextures(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGetActiveAttrib, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetActiveAttrib(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32)), ONYX_PTR(P(5, i32)), ONYX_PTR(P(6, i32))); - return NULL; -} - -ONYX_DEF(glGetActiveUniform, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetActiveUniform(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32)), ONYX_PTR(P(5, i32)), ONYX_PTR(P(6, i32))); - return NULL; -} - -ONYX_DEF(glGetAttachedShaders, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetAttachedShaders(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetAttribLocation, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glGetAttribLocation(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glGetBooleanv, (WASM_I32, WASM_I32), ()) { - glad_glGetBooleanv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGetBufferParameteriv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetBufferParameteriv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetError, (), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glGetError()); - return NULL; -} - -ONYX_DEF(glGetFloatv, (WASM_I32, WASM_I32), ()) { - glad_glGetFloatv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGetFramebufferAttachmentParameteriv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetFramebufferAttachmentParameteriv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetIntegerv, (WASM_I32, WASM_I32), ()) { - glad_glGetIntegerv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGetProgramiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetProgramiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetProgramInfoLog, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetProgramInfoLog(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetRenderbufferParameteriv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetRenderbufferParameteriv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetShaderiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetShaderiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetShaderInfoLog, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetShaderInfoLog(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetShaderPrecisionFormat, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetShaderPrecisionFormat(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetShaderSource, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetShaderSource(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetString, (WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glad_glGetString(P(0, i32))); - return NULL; -} - -ONYX_DEF(glGetTexParameterfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetTexParameterfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetTexParameteriv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetTexParameteriv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetUniformfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetUniformfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetUniformiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetUniformiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetUniformLocation, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glGetUniformLocation(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glGetVertexAttribfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetVertexAttribfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetVertexAttribiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetVertexAttribiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetVertexAttribPointerv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetVertexAttribPointerv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glHint, (WASM_I32, WASM_I32), ()) { - glad_glHint(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glIsBuffer, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsBuffer(P(0, i32))); - return NULL; -} - -ONYX_DEF(glIsEnabled, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsEnabled(P(0, i32))); - return NULL; -} - -ONYX_DEF(glIsFramebuffer, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsFramebuffer(P(0, i32))); - return NULL; -} - -ONYX_DEF(glIsProgram, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsProgram(P(0, i32))); - return NULL; -} - -ONYX_DEF(glIsRenderbuffer, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsRenderbuffer(P(0, i32))); - return NULL; -} - -ONYX_DEF(glIsShader, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsShader(P(0, i32))); - return NULL; -} - -ONYX_DEF(glIsTexture, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsTexture(P(0, i32))); - return NULL; -} - -ONYX_DEF(glLineWidth, (WASM_F32), ()) { - glad_glLineWidth(P(0, f32)); - return NULL; -} - -ONYX_DEF(glLinkProgram, (WASM_I32), ()) { - glad_glLinkProgram(P(0, i32)); - return NULL; -} - -ONYX_DEF(glPixelStorei, (WASM_I32, WASM_I32), ()) { - glad_glPixelStorei(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glPolygonOffset, (WASM_F32, WASM_F32), ()) { - glad_glPolygonOffset(P(0, f32), P(1, f32)); - return NULL; -} - -ONYX_DEF(glReadPixels, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glReadPixels(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), ONYX_PTR(P(6, i32))); - return NULL; -} - -ONYX_DEF(glReleaseShaderCompiler, (), ()) { - glad_glReleaseShaderCompiler(); - return NULL; -} - -ONYX_DEF(glRenderbufferStorage, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glRenderbufferStorage(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glSampleCoverage, (WASM_F32, WASM_I32), ()) { - glad_glSampleCoverage(P(0, f32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glScissor, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glScissor(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glShaderBinary, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glShaderBinary(P(0, i32), ONYX_PTR(P(1, i32)), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32)); - return NULL; -} - -ONYX_DEF(glShaderSource, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glShaderSource(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glStencilFunc, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glStencilFunc(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glStencilFuncSeparate, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glStencilFuncSeparate(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glStencilMask, (WASM_I32), ()) { - glad_glStencilMask(P(0, i32)); - return NULL; -} - -ONYX_DEF(glStencilMaskSeparate, (WASM_I32, WASM_I32), ()) { - glad_glStencilMaskSeparate(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glStencilOp, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glStencilOp(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glStencilOpSeparate, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glStencilOpSeparate(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glTexImage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexImage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), ONYX_PTR(P(8, i32))); - return NULL; -} - -ONYX_DEF(glTexParameterf, (WASM_I32, WASM_I32, WASM_F32), ()) { - glad_glTexParameterf(P(0, i32), P(1, i32), P(2, f32)); - return NULL; -} - -ONYX_DEF(glTexParameterfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexParameterfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glTexParameteri, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexParameteri(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glTexParameteriv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexParameteriv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glTexSubImage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexSubImage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), ONYX_PTR(P(8, i32))); - return NULL; -} - -ONYX_DEF(glUniform1f, (WASM_I32, WASM_F32), ()) { - glad_glUniform1f(P(0, i32), P(1, f32)); - return NULL; -} - -ONYX_DEF(glUniform1fv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform1fv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform1i, (WASM_I32, WASM_I32), ()) { - glad_glUniform1i(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glUniform1iv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform1iv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform2f, (WASM_I32, WASM_F32, WASM_F32), ()) { - glad_glUniform2f(P(0, i32), P(1, f32), P(2, f32)); - return NULL; -} - -ONYX_DEF(glUniform2fv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform2fv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform2i, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform2i(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glUniform2iv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform2iv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform3f, (WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { - glad_glUniform3f(P(0, i32), P(1, f32), P(2, f32), P(3, f32)); - return NULL; -} - -ONYX_DEF(glUniform3fv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform3fv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform3i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform3i(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glUniform3iv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform3iv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform4f, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_F32), ()) { - glad_glUniform4f(P(0, i32), P(1, f32), P(2, f32), P(3, f32), P(4, f32)); - return NULL; -} - -ONYX_DEF(glUniform4fv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform4fv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform4i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform4i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glUniform4iv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform4iv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix2fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix2fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix3fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix3fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix4fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix4fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUseProgram, (WASM_I32), ()) { - glad_glUseProgram(P(0, i32)); - return NULL; -} - -ONYX_DEF(glValidateProgram, (WASM_I32), ()) { - glad_glValidateProgram(P(0, i32)); - return NULL; -} - -ONYX_DEF(glVertexAttrib1f, (WASM_I32, WASM_F32), ()) { - glad_glVertexAttrib1f(P(0, i32), P(1, f32)); - return NULL; -} - -ONYX_DEF(glVertexAttrib1fv, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttrib1fv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttrib2f, (WASM_I32, WASM_F32, WASM_F32), ()) { - glad_glVertexAttrib2f(P(0, i32), P(1, f32), P(2, f32)); - return NULL; -} - -ONYX_DEF(glVertexAttrib2fv, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttrib2fv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttrib3f, (WASM_I32, WASM_F32, WASM_F32, WASM_F32), ()) { - glad_glVertexAttrib3f(P(0, i32), P(1, f32), P(2, f32), P(3, f32)); - return NULL; -} - -ONYX_DEF(glVertexAttrib3fv, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttrib3fv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttrib4f, (WASM_I32, WASM_F32, WASM_F32, WASM_F32, WASM_F32), ()) { - glad_glVertexAttrib4f(P(0, i32), P(1, f32), P(2, f32), P(3, f32), P(4, f32)); - return NULL; -} - -ONYX_DEF(glVertexAttrib4fv, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttrib4fv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttribPointer, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glVertexAttribPointer(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), ONYX_PTR(P(5, i32))); - return NULL; -} - -ONYX_DEF(glViewport, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glViewport(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glReadBuffer, (WASM_I32), ()) { - glad_glReadBuffer(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDrawRangeElements, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glDrawRangeElements(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), ONYX_PTR(P(5, i32))); - return NULL; -} - -ONYX_DEF(glTexImage3D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexImage3D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32), ONYX_PTR(P(9, i32))); - return NULL; -} - -ONYX_DEF(glTexSubImage3D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexSubImage3D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32), P(9, i32), ONYX_PTR(P(10, i32))); - return NULL; -} - -ONYX_DEF(glCopyTexSubImage3D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCopyTexSubImage3D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32)); - return NULL; -} - -ONYX_DEF(glCompressedTexImage3D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCompressedTexImage3D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), ONYX_PTR(P(8, i32))); - return NULL; -} - -ONYX_DEF(glCompressedTexSubImage3D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCompressedTexSubImage3D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32), P(9, i32), ONYX_PTR(P(10, i32))); - return NULL; -} - -ONYX_DEF(glGenQueries, (WASM_I32, WASM_I32), ()) { - glad_glGenQueries(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glDeleteQueries, (WASM_I32, WASM_I32), ()) { - glad_glDeleteQueries(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glIsQuery, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsQuery(P(0, i32))); - return NULL; -} - -ONYX_DEF(glBeginQuery, (WASM_I32, WASM_I32), ()) { - glad_glBeginQuery(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glEndQuery, (WASM_I32), ()) { - glad_glEndQuery(P(0, i32)); - return NULL; -} - -ONYX_DEF(glGetQueryiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetQueryiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetQueryObjectuiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetQueryObjectuiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUnmapBuffer, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glUnmapBuffer(P(0, i32))); - return NULL; -} - -ONYX_DEF(glGetBufferPointerv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetBufferPointerv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glDrawBuffers, (WASM_I32, WASM_I32), ()) { - glad_glDrawBuffers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix2x3fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix2x3fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix3x2fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix3x2fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix2x4fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix2x4fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix4x2fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix4x2fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix3x4fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix3x4fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glUniformMatrix4x3fv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformMatrix4x3fv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glBlitFramebuffer, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBlitFramebuffer(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32), P(6, i32), P(7, i32), P(8, i32), P(9, i32)); - return NULL; -} - -ONYX_DEF(glRenderbufferStorageMultisample, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glRenderbufferStorageMultisample(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glFramebufferTextureLayer, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glFramebufferTextureLayer(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glMapBufferRange, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glMapBufferRange(P(0, i32), P(1, i32), P(2, i32), P(3, i32))); - return NULL; -} - -ONYX_DEF(glFlushMappedBufferRange, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glFlushMappedBufferRange(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glBindVertexArray, (WASM_I32), ()) { - glad_glBindVertexArray(P(0, i32)); - return NULL; -} - -ONYX_DEF(glDeleteVertexArrays, (WASM_I32, WASM_I32), ()) { - glad_glDeleteVertexArrays(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGenVertexArrays, (WASM_I32, WASM_I32), ()) { - glad_glGenVertexArrays(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glIsVertexArray, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsVertexArray(P(0, i32))); - return NULL; -} - -ONYX_DEF(glGetIntegeri_v, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetIntegeri_v(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glBeginTransformFeedback, (WASM_I32), ()) { - glad_glBeginTransformFeedback(P(0, i32)); - return NULL; -} - -ONYX_DEF(glEndTransformFeedback, (), ()) { - glad_glEndTransformFeedback(); - return NULL; -} - -ONYX_DEF(glBindBufferRange, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBindBufferRange(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glBindBufferBase, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glBindBufferBase(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glTransformFeedbackVaryings, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTransformFeedbackVaryings(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32)); - return NULL; -} - -ONYX_DEF(glGetTransformFeedbackVarying, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetTransformFeedbackVarying(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32)), ONYX_PTR(P(5, i32)), ONYX_PTR(P(6, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttribIPointer, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glVertexAttribIPointer(P(0, i32), P(1, i32), P(2, i32), P(3, i32), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(glGetVertexAttribIiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetVertexAttribIiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetVertexAttribIuiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetVertexAttribIuiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttribI4i, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glVertexAttribI4i(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glVertexAttribI4ui, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glVertexAttribI4ui(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glVertexAttribI4iv, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttribI4iv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttribI4uiv, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttribI4uiv(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGetUniformuiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetUniformuiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetFragDataLocation, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glGetFragDataLocation(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glUniform1ui, (WASM_I32, WASM_I32), ()) { - glad_glUniform1ui(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glUniform2ui, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform2ui(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glUniform3ui, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform3ui(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glUniform4ui, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform4ui(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glUniform1uiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform1uiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform2uiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform2uiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform3uiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform3uiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glUniform4uiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniform4uiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glClearBufferiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glClearBufferiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glClearBufferuiv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glClearBufferuiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glClearBufferfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glClearBufferfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glClearBufferfi, (WASM_I32, WASM_I32, WASM_F32, WASM_I32), ()) { - glad_glClearBufferfi(P(0, i32), P(1, i32), P(2, f32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glGetStringi, (WASM_I32, WASM_I32), (WASM_I64)) { - results->data[0] = WASM_I64_VAL(glad_glGetStringi(P(0, i32), P(1, i32))); - return NULL; -} - -ONYX_DEF(glCopyBufferSubData, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glCopyBufferSubData(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glGetUniformIndices, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetUniformIndices(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetActiveUniformsiv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetActiveUniformsiv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(glGetUniformBlockIndex, (WASM_I32, WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glGetUniformBlockIndex(P(0, i32), ONYX_PTR(P(1, i32)))); - return NULL; -} - -ONYX_DEF(glGetActiveUniformBlockiv, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetActiveUniformBlockiv(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32))); - return NULL; -} - -ONYX_DEF(glGetActiveUniformBlockName, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetActiveUniformBlockName(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(glUniformBlockBinding, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glUniformBlockBinding(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glDrawArraysInstanced, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glDrawArraysInstanced(P(0, i32), P(1, i32), P(2, i32), P(3, i32)); - return NULL; -} - -ONYX_DEF(glDrawElementsInstanced, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glDrawElementsInstanced(P(0, i32), P(1, i32), P(2, i32), ONYX_PTR(P(3, i32)), P(4, i32)); - return NULL; -} - -ONYX_DEF(glGetInteger64v, (WASM_I32, WASM_I32), ()) { - glad_glGetInteger64v(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGetInteger64i_v, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetInteger64i_v(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetBufferParameteri64v, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetBufferParameteri64v(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGenSamplers, (WASM_I32, WASM_I32), ()) { - glad_glGenSamplers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glDeleteSamplers, (WASM_I32, WASM_I32), ()) { - glad_glDeleteSamplers(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glIsSampler, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsSampler(P(0, i32))); - return NULL; -} - -ONYX_DEF(glBindSampler, (WASM_I32, WASM_I32), ()) { - glad_glBindSampler(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glSamplerParameteri, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glSamplerParameteri(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glSamplerParameteriv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glSamplerParameteriv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glSamplerParameterf, (WASM_I32, WASM_I32, WASM_F32), ()) { - glad_glSamplerParameterf(P(0, i32), P(1, i32), P(2, f32)); - return NULL; -} - -ONYX_DEF(glSamplerParameterfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glSamplerParameterfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetSamplerParameteriv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetSamplerParameteriv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glGetSamplerParameterfv, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetSamplerParameterfv(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glVertexAttribDivisor, (WASM_I32, WASM_I32), ()) { - glad_glVertexAttribDivisor(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glBindTransformFeedback, (WASM_I32, WASM_I32), ()) { - glad_glBindTransformFeedback(P(0, i32), P(1, i32)); - return NULL; -} - -ONYX_DEF(glDeleteTransformFeedbacks, (WASM_I32, WASM_I32), ()) { - glad_glDeleteTransformFeedbacks(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glGenTransformFeedbacks, (WASM_I32, WASM_I32), ()) { - glad_glGenTransformFeedbacks(P(0, i32), ONYX_PTR(P(1, i32))); - return NULL; -} - -ONYX_DEF(glIsTransformFeedback, (WASM_I32), (WASM_I32)) { - results->data[0] = WASM_I32_VAL(glad_glIsTransformFeedback(P(0, i32))); - return NULL; -} - -ONYX_DEF(glPauseTransformFeedback, (), ()) { - glad_glPauseTransformFeedback(); - return NULL; -} - -ONYX_DEF(glResumeTransformFeedback, (), ()) { - glad_glResumeTransformFeedback(); - return NULL; -} - -ONYX_DEF(glGetProgramBinary, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetProgramBinary(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), ONYX_PTR(P(3, i32)), ONYX_PTR(P(4, i32))); - return NULL; -} - -ONYX_DEF(glProgramBinary, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glProgramBinary(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32)); - return NULL; -} - -ONYX_DEF(glProgramParameteri, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glProgramParameteri(P(0, i32), P(1, i32), P(2, i32)); - return NULL; -} - -ONYX_DEF(glInvalidateFramebuffer, (WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glInvalidateFramebuffer(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32))); - return NULL; -} - -ONYX_DEF(glInvalidateSubFramebuffer, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glInvalidateSubFramebuffer(P(0, i32), P(1, i32), ONYX_PTR(P(2, i32)), P(3, i32), P(4, i32), P(5, i32), P(6, i32)); - return NULL; -} - -ONYX_DEF(glTexStorage2D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexStorage2D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32)); - return NULL; -} - -ONYX_DEF(glTexStorage3D, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glTexStorage3D(P(0, i32), P(1, i32), P(2, i32), P(3, i32), P(4, i32), P(5, i32)); - return NULL; -} - -ONYX_DEF(glGetInternalformativ, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32), ()) { - glad_glGetInternalformativ(P(0, i32), P(1, i32), P(2, i32), P(3, i32), ONYX_PTR(P(4, i32))); - return NULL; -} - - - -ONYX_LIBRARY { - ONYX_FUNC(glInit) - ONYX_FUNC(glActiveTexture) - ONYX_FUNC(glAttachShader) - ONYX_FUNC(glBindAttribLocation) - ONYX_FUNC(glBindBuffer) - ONYX_FUNC(glBindFramebuffer) - ONYX_FUNC(glBindRenderbuffer) - ONYX_FUNC(glBindTexture) - ONYX_FUNC(glBlendColor) - ONYX_FUNC(glBlendEquation) - ONYX_FUNC(glBlendEquationSeparate) - ONYX_FUNC(glBlendFunc) - ONYX_FUNC(glBlendFuncSeparate) - ONYX_FUNC(glBufferData) - ONYX_FUNC(glBufferSubData) - ONYX_FUNC(glCheckFramebufferStatus) - ONYX_FUNC(glClear) - ONYX_FUNC(glClearColor) - ONYX_FUNC(glClearDepthf) - ONYX_FUNC(glClearStencil) - ONYX_FUNC(glColorMask) - ONYX_FUNC(glCompileShader) - ONYX_FUNC(glCompressedTexImage2D) - ONYX_FUNC(glCompressedTexSubImage2D) - ONYX_FUNC(glCopyTexImage2D) - ONYX_FUNC(glCopyTexSubImage2D) - ONYX_FUNC(glCreateProgram) - ONYX_FUNC(glCreateShader) - ONYX_FUNC(glCullFace) - ONYX_FUNC(glDeleteBuffers) - ONYX_FUNC(glDeleteFramebuffers) - ONYX_FUNC(glDeleteProgram) - ONYX_FUNC(glDeleteRenderbuffers) - ONYX_FUNC(glDeleteShader) - ONYX_FUNC(glDeleteTextures) - ONYX_FUNC(glDepthFunc) - ONYX_FUNC(glDepthMask) - ONYX_FUNC(glDepthRangef) - ONYX_FUNC(glDetachShader) - ONYX_FUNC(glDisable) - ONYX_FUNC(glDisableVertexAttribArray) - ONYX_FUNC(glDrawArrays) - ONYX_FUNC(glDrawElements) - ONYX_FUNC(glEnable) - ONYX_FUNC(glEnableVertexAttribArray) - ONYX_FUNC(glFinish) - ONYX_FUNC(glFlush) - ONYX_FUNC(glFramebufferRenderbuffer) - ONYX_FUNC(glFramebufferTexture2D) - ONYX_FUNC(glFrontFace) - ONYX_FUNC(glGenBuffers) - ONYX_FUNC(glGenerateMipmap) - ONYX_FUNC(glGenFramebuffers) - ONYX_FUNC(glGenRenderbuffers) - ONYX_FUNC(glGenTextures) - ONYX_FUNC(glGetActiveAttrib) - ONYX_FUNC(glGetActiveUniform) - ONYX_FUNC(glGetAttachedShaders) - ONYX_FUNC(glGetAttribLocation) - ONYX_FUNC(glGetBooleanv) - ONYX_FUNC(glGetBufferParameteriv) - ONYX_FUNC(glGetError) - ONYX_FUNC(glGetFloatv) - ONYX_FUNC(glGetFramebufferAttachmentParameteriv) - ONYX_FUNC(glGetIntegerv) - ONYX_FUNC(glGetProgramiv) - ONYX_FUNC(glGetProgramInfoLog) - ONYX_FUNC(glGetRenderbufferParameteriv) - ONYX_FUNC(glGetShaderiv) - ONYX_FUNC(glGetShaderInfoLog) - ONYX_FUNC(glGetShaderPrecisionFormat) - ONYX_FUNC(glGetShaderSource) - ONYX_FUNC(glGetString) - ONYX_FUNC(glGetTexParameterfv) - ONYX_FUNC(glGetTexParameteriv) - ONYX_FUNC(glGetUniformfv) - ONYX_FUNC(glGetUniformiv) - ONYX_FUNC(glGetUniformLocation) - ONYX_FUNC(glGetVertexAttribfv) - ONYX_FUNC(glGetVertexAttribiv) - ONYX_FUNC(glGetVertexAttribPointerv) - ONYX_FUNC(glHint) - ONYX_FUNC(glIsBuffer) - ONYX_FUNC(glIsEnabled) - ONYX_FUNC(glIsFramebuffer) - ONYX_FUNC(glIsProgram) - ONYX_FUNC(glIsRenderbuffer) - ONYX_FUNC(glIsShader) - ONYX_FUNC(glIsTexture) - ONYX_FUNC(glLineWidth) - ONYX_FUNC(glLinkProgram) - ONYX_FUNC(glPixelStorei) - ONYX_FUNC(glPolygonOffset) - ONYX_FUNC(glReadPixels) - ONYX_FUNC(glReleaseShaderCompiler) - ONYX_FUNC(glRenderbufferStorage) - ONYX_FUNC(glSampleCoverage) - ONYX_FUNC(glScissor) - ONYX_FUNC(glShaderBinary) - ONYX_FUNC(glShaderSource) - ONYX_FUNC(glStencilFunc) - ONYX_FUNC(glStencilFuncSeparate) - ONYX_FUNC(glStencilMask) - ONYX_FUNC(glStencilMaskSeparate) - ONYX_FUNC(glStencilOp) - ONYX_FUNC(glStencilOpSeparate) - ONYX_FUNC(glTexImage2D) - ONYX_FUNC(glTexParameterf) - ONYX_FUNC(glTexParameterfv) - ONYX_FUNC(glTexParameteri) - ONYX_FUNC(glTexParameteriv) - ONYX_FUNC(glTexSubImage2D) - ONYX_FUNC(glUniform1f) - ONYX_FUNC(glUniform1fv) - ONYX_FUNC(glUniform1i) - ONYX_FUNC(glUniform1iv) - ONYX_FUNC(glUniform2f) - ONYX_FUNC(glUniform2fv) - ONYX_FUNC(glUniform2i) - ONYX_FUNC(glUniform2iv) - ONYX_FUNC(glUniform3f) - ONYX_FUNC(glUniform3fv) - ONYX_FUNC(glUniform3i) - ONYX_FUNC(glUniform3iv) - ONYX_FUNC(glUniform4f) - ONYX_FUNC(glUniform4fv) - ONYX_FUNC(glUniform4i) - ONYX_FUNC(glUniform4iv) - ONYX_FUNC(glUniformMatrix2fv) - ONYX_FUNC(glUniformMatrix3fv) - ONYX_FUNC(glUniformMatrix4fv) - ONYX_FUNC(glUseProgram) - ONYX_FUNC(glValidateProgram) - ONYX_FUNC(glVertexAttrib1f) - ONYX_FUNC(glVertexAttrib1fv) - ONYX_FUNC(glVertexAttrib2f) - ONYX_FUNC(glVertexAttrib2fv) - ONYX_FUNC(glVertexAttrib3f) - ONYX_FUNC(glVertexAttrib3fv) - ONYX_FUNC(glVertexAttrib4f) - ONYX_FUNC(glVertexAttrib4fv) - ONYX_FUNC(glVertexAttribPointer) - ONYX_FUNC(glViewport) - ONYX_FUNC(glReadBuffer) - ONYX_FUNC(glDrawRangeElements) - ONYX_FUNC(glTexImage3D) - ONYX_FUNC(glTexSubImage3D) - ONYX_FUNC(glCopyTexSubImage3D) - ONYX_FUNC(glCompressedTexImage3D) - ONYX_FUNC(glCompressedTexSubImage3D) - ONYX_FUNC(glGenQueries) - ONYX_FUNC(glDeleteQueries) - ONYX_FUNC(glIsQuery) - ONYX_FUNC(glBeginQuery) - ONYX_FUNC(glEndQuery) - ONYX_FUNC(glGetQueryiv) - ONYX_FUNC(glGetQueryObjectuiv) - ONYX_FUNC(glUnmapBuffer) - ONYX_FUNC(glGetBufferPointerv) - ONYX_FUNC(glDrawBuffers) - ONYX_FUNC(glUniformMatrix2x3fv) - ONYX_FUNC(glUniformMatrix3x2fv) - ONYX_FUNC(glUniformMatrix2x4fv) - ONYX_FUNC(glUniformMatrix4x2fv) - ONYX_FUNC(glUniformMatrix3x4fv) - ONYX_FUNC(glUniformMatrix4x3fv) - ONYX_FUNC(glBlitFramebuffer) - ONYX_FUNC(glRenderbufferStorageMultisample) - ONYX_FUNC(glFramebufferTextureLayer) - ONYX_FUNC(glMapBufferRange) - ONYX_FUNC(glFlushMappedBufferRange) - ONYX_FUNC(glBindVertexArray) - ONYX_FUNC(glDeleteVertexArrays) - ONYX_FUNC(glGenVertexArrays) - ONYX_FUNC(glIsVertexArray) - ONYX_FUNC(glGetIntegeri_v) - ONYX_FUNC(glBeginTransformFeedback) - ONYX_FUNC(glEndTransformFeedback) - ONYX_FUNC(glBindBufferRange) - ONYX_FUNC(glBindBufferBase) - ONYX_FUNC(glTransformFeedbackVaryings) - ONYX_FUNC(glGetTransformFeedbackVarying) - ONYX_FUNC(glVertexAttribIPointer) - ONYX_FUNC(glGetVertexAttribIiv) - ONYX_FUNC(glGetVertexAttribIuiv) - ONYX_FUNC(glVertexAttribI4i) - ONYX_FUNC(glVertexAttribI4ui) - ONYX_FUNC(glVertexAttribI4iv) - ONYX_FUNC(glVertexAttribI4uiv) - ONYX_FUNC(glGetUniformuiv) - ONYX_FUNC(glGetFragDataLocation) - ONYX_FUNC(glUniform1ui) - ONYX_FUNC(glUniform2ui) - ONYX_FUNC(glUniform3ui) - ONYX_FUNC(glUniform4ui) - ONYX_FUNC(glUniform1uiv) - ONYX_FUNC(glUniform2uiv) - ONYX_FUNC(glUniform3uiv) - ONYX_FUNC(glUniform4uiv) - ONYX_FUNC(glClearBufferiv) - ONYX_FUNC(glClearBufferuiv) - ONYX_FUNC(glClearBufferfv) - ONYX_FUNC(glClearBufferfi) - ONYX_FUNC(glGetStringi) - ONYX_FUNC(glCopyBufferSubData) - ONYX_FUNC(glGetUniformIndices) - ONYX_FUNC(glGetActiveUniformsiv) - ONYX_FUNC(glGetUniformBlockIndex) - ONYX_FUNC(glGetActiveUniformBlockiv) - ONYX_FUNC(glGetActiveUniformBlockName) - ONYX_FUNC(glUniformBlockBinding) - ONYX_FUNC(glDrawArraysInstanced) - ONYX_FUNC(glDrawElementsInstanced) - ONYX_FUNC(glGetInteger64v) - ONYX_FUNC(glGetInteger64i_v) - ONYX_FUNC(glGetBufferParameteri64v) - ONYX_FUNC(glGenSamplers) - ONYX_FUNC(glDeleteSamplers) - ONYX_FUNC(glIsSampler) - ONYX_FUNC(glBindSampler) - ONYX_FUNC(glSamplerParameteri) - ONYX_FUNC(glSamplerParameteriv) - ONYX_FUNC(glSamplerParameterf) - ONYX_FUNC(glSamplerParameterfv) - ONYX_FUNC(glGetSamplerParameteriv) - ONYX_FUNC(glGetSamplerParameterfv) - ONYX_FUNC(glVertexAttribDivisor) - ONYX_FUNC(glBindTransformFeedback) - ONYX_FUNC(glDeleteTransformFeedbacks) - ONYX_FUNC(glGenTransformFeedbacks) - ONYX_FUNC(glIsTransformFeedback) - ONYX_FUNC(glPauseTransformFeedback) - ONYX_FUNC(glResumeTransformFeedback) - ONYX_FUNC(glGetProgramBinary) - ONYX_FUNC(glProgramBinary) - ONYX_FUNC(glProgramParameteri) - ONYX_FUNC(glInvalidateFramebuffer) - ONYX_FUNC(glInvalidateSubFramebuffer) - ONYX_FUNC(glTexStorage2D) - ONYX_FUNC(glTexStorage3D) - ONYX_FUNC(glGetInternalformativ) - NULL -}; \ No newline at end of file diff --git a/modules/perlin/module.onyx b/modules/perlin/module.onyx deleted file mode 100644 index 96378e9c..00000000 --- a/modules/perlin/module.onyx +++ /dev/null @@ -1,7 +0,0 @@ -package perlin - -#load "./perlin" - -#package { - core :: package core -} diff --git a/modules/perlin/perlin.onyx b/modules/perlin/perlin.onyx deleted file mode 100644 index d4bd4b64..00000000 --- a/modules/perlin/perlin.onyx +++ /dev/null @@ -1,80 +0,0 @@ -package perlin - -noise :: (x, y, z: f64) -> f64 { - X := (cast(i32) core.math.floor(x)) & 255; - Y := (cast(i32) core.math.floor(y)) & 255; - Z := (cast(i32) core.math.floor(z)) & 255; - - x -= core.math.floor(x); - y -= core.math.floor(y); - z -= core.math.floor(z); - - u := fade(x); - v := fade(y); - w := fade(z); - - A := p(X) + Y; - AA := p(A) + Z; - AB := p(A+1) + Z; - B := p(X+1) + Y; - BA := p(B) + Z; - BB := p(B+1) + Z; - - return lerp(w, lerp(v, lerp(u, grad(p(AA ), x , y , z ), - grad(p(BA ), x-1, y , z )), - lerp(u, grad(p(AB ), x , y-1, z ), - grad(p(BB ), x-1, y-1, z ))), - lerp(v, lerp(u, grad(p(AA+1), x , y , z-1 ), - grad(p(BA+1), x-1, y , z-1 )), - lerp(u, grad(p(AB+1), x , y-1, z-1 ), - grad(p(BB+1), x-1, y-1, z-1 )))); -} - - -#local { - fade :: macro (t: f64) => t * t * t * (t * (t * 6 - 15) + 10); - lerp :: macro (t, a, b: f64) => a + t * (b - a); - - grad :: (hash: i32, x, y, z: f64) -> f64 { - switch hash & 0xF { - case 0x0 do return x + y; - case 0x1 do return -x + y; - case 0x2 do return x - y; - case 0x3 do return -x - y; - case 0x4 do return x + z; - case 0x5 do return -x + z; - case 0x6 do return x - z; - case 0x7 do return -x - z; - case 0x8 do return y + z; - case 0x9 do return -y + z; - case 0xA do return y - z; - case 0xB do return -y - z; - case 0xC do return y + x; - case 0xD do return -y + z; - case 0xE do return y - x; - case 0xF do return -y - z; - case #default do return 0; // never happens - } - } - - permutations: [256] u8 = u8.[ - 151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142, - 8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117, - 35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71, - 134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41, - 55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, - 89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217, - 226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58, - 17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9, - 129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228, - 251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107, - 49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254, - 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 - ]; - - p :: macro (x: i32) -> i32 { - permutations :: permutations; - return cast(i32) permutations[x % 256]; - } -} - diff --git a/modules/qoi/module.onyx b/modules/qoi/module.onyx deleted file mode 100644 index 55cb1e60..00000000 --- a/modules/qoi/module.onyx +++ /dev/null @@ -1,7 +0,0 @@ -package qoi - -#package { - math :: package core.math -} - -#load "./qoi" \ No newline at end of file diff --git a/modules/qoi/qoi.onyx b/modules/qoi/qoi.onyx deleted file mode 100644 index 1e0fe8a2..00000000 --- a/modules/qoi/qoi.onyx +++ /dev/null @@ -1,161 +0,0 @@ -package qoi - -Image :: struct { - width: u32; - height: u32; - channels: u32; - data: [] u8; -} - -#local Header :: struct #pack { - magic: [4] u8; - be_width: u32; - be_height: u32; - channels: u8; - colorspace: u8; -} - -#local Color :: struct { - r, g, b, a: u8; -} - -image_free :: (img: Image) { - delete(^img.data); -} - -decode_image :: (buf: [] u8, allocator := context.allocator) -> Image { - img: Image; - - header := cast(^Header) buf.data; - pos := sizeof Header; - out_pos := 0; - - img.width = swap_endian(header.be_width); - img.height = swap_endian(header.be_height); - img.channels = ~~header.channels; - img.data = make([] u8, img.width * img.height * img.channels, allocator=allocator); - - prev_pixel := Color.{0, 0, 0, 255}; - prev_pixels: [64] Color; - - while out_pos < img.data.count { - tag := buf[pos]; - if tag == OP_RGB { - prev_pixel.r = buf[pos + 1]; - prev_pixel.g = buf[pos + 2]; - prev_pixel.b = buf[pos + 3]; - output_color(prev_pixel); - pos += 4; - - } elseif tag == OP_RGBA { - prev_pixel.r = buf[pos + 1]; - prev_pixel.g = buf[pos + 2]; - prev_pixel.b = buf[pos + 3]; - prev_pixel.a = buf[pos + 4]; - output_color(prev_pixel); - pos += 5; - - } elseif tag & OP_MASK == OP_INDEX { - index := tag & ~~0x3f; - - p := prev_pixels[index]; - output_color(p); - - pos += 1; - prev_pixel = p; - - } elseif tag & OP_MASK == OP_DIFF { - dr := cast(i32) ((tag & ~~0x30) >> 4) - 2; - dg := cast(i32) ((tag & ~~0x0c) >> 2) - 2; - db := cast(i32) ((tag & ~~0x03) ) - 2; - - p := prev_pixel; - p.r = ~~(~~p.r + dr); - p.g = ~~(~~p.g + dg); - p.b = ~~(~~p.b + db); - - output_color(p); - - pos += 1; - prev_pixel = p; - - } elseif tag & OP_MASK == OP_LUMA { - dg := cast(i32) ((buf[pos + 0] & ~~0x3f) ) - 32; - dr_dg := cast(i32) ((buf[pos + 1] & ~~0xf0) >> 4) - 8; - db_dg := cast(i32) ((buf[pos + 1] & ~~0x0f) ) - 8; - - p := prev_pixel; - p.r = ~~(~~p.r + dr_dg + dg); - p.g = ~~(~~p.g + dg); - p.b = ~~(~~p.b + db_dg + dg); - - output_color(p); - - pos += 2; - prev_pixel = p; - - } elseif tag & OP_MASK == OP_RUN { - len := (tag & ~~0x3f) + 1; - for cast(u32) len { - output_color(prev_pixel); - } - pos += 1; - } - - prev_pixels[hash_for_index(prev_pixel)] = prev_pixel; - } - - return img; -} - -#local { - OP_RGB :: cast(u8) 0xfe - OP_RGBA :: cast(u8) 0xff - - OP_MASK :: cast(u8) 0xc0 - OP_INDEX :: cast(u8) 0x00 - OP_DIFF :: cast(u8) 0x40 - OP_LUMA :: cast(u8) 0x80 - OP_RUN :: cast(u8) 0xc0 -} - -#local hash_for_index :: macro (c: Color) -> u32 { - return ~~ ((c.r * 3 + c.g * 5 + c.b * 7 + c.a * 11) % 64); -} - -#local swap_endian :: macro (x: u32) -> u32 { - y := x; - return (((y >> 24) & 0xff) ) - | (((y >> 16) & 0xff) << 8 ) - | (((y >> 8) & 0xff) << 16) - | (((y >> 0) & 0xff) << 24); -} - -#local output_color :: macro (c: Color) { - if header.colorspace == 1 { - img.data[out_pos+0], img.data[out_pos+1], img.data[out_pos+2] = srgb_to_rgb(c); - - } else { - img.data[out_pos + 0] = c.r; - img.data[out_pos + 1] = c.g; - img.data[out_pos + 2] = c.b; - } - - if img.channels == 4 do img.data[out_pos + 3] = c.a; - out_pos += img.channels; -} - -#local srgb_to_rgb :: macro (c: Color) -> (r: u8, g: u8, b: u8) { - sr := cast(f32) cast(u32) c.r / 255; - sg := cast(f32) cast(u32) c.g / 255; - sb := cast(f32) cast(u32) c.b / 255; - - r := (sr / 12.92) if sr <= 0.0405 else math.pow((sr + 0.055)/1.055, 2.4); - g := (sg / 12.92) if sg <= 0.0405 else math.pow((sg + 0.055)/1.055, 2.4); - b := (sb / 12.92) if sb <= 0.0405 else math.pow((sb + 0.055)/1.055, 2.4); - - or := cast(u8) cast(u32) math.floor(r * 255); - og := cast(u8) cast(u32) math.floor(g * 255); - ob := cast(u8) cast(u32) math.floor(b * 255); - return or, og, ob; -} diff --git a/modules/stb_image/build.onyx b/modules/stb_image/build.onyx deleted file mode 100644 index feda8a67..00000000 --- a/modules/stb_image/build.onyx +++ /dev/null @@ -1,10 +0,0 @@ -#load "scripts/c_library" -use package core - -main :: () { - path := module_path(#file); - - compile_c_file( - string.concat(path, "stb_image.c"), - string.concat(path, "stb_image.so")); -} \ No newline at end of file diff --git a/modules/stb_image/module.onyx b/modules/stb_image/module.onyx deleted file mode 100644 index 2f691d37..00000000 --- a/modules/stb_image/module.onyx +++ /dev/null @@ -1,18 +0,0 @@ -package stb_image - -use package core { cptr } - -#library "stb_image" - -#foreign "stb_image" { - stbi_load :: (filename: cstr, width: ^i32, height: ^i32, channels: ^i32, desired_channels: i32) -> ^u8 --- - stbi_load_from_memory :: (buffer: [] u8, width: ^i32, height: ^i32, channels: ^i32, desired_channels: i32) -> ^u8 --- - stbi_load_gif_from_memory :: (buffer: [] u8, delays: ^cptr(i32), width: ^i32, height: ^i32, frames: ^i32, comp: ^i32, req_comp: i32) -> ^u8 --- - - stbi_image_free :: (image_data: ^u8) -> void --- -} - -#export "stbi_heap_alloc" calloc -#export "stbi_heap_resize" cresize -#export "stbi_heap_free" cfree - diff --git a/modules/stb_image/stb_image.c b/modules/stb_image/stb_image.c deleted file mode 100644 index c46c0845..00000000 --- a/modules/stb_image/stb_image.c +++ /dev/null @@ -1,125 +0,0 @@ -#define ONYX_LIBRARY_NAME stb_image -#include "onyx_library.h" - -static wasm_func_t* stbi_heap_alloc = NULL; -static void *__onyx_stbi_heap_alloc_wrapper(int size) { - if (stbi_heap_alloc == NULL) { - wasm_extern_t *stbi_heap_alloc_extern = runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, "stbi_heap_alloc"); - stbi_heap_alloc = runtime->wasm_extern_as_func(stbi_heap_alloc_extern); - assert(stbi_heap_alloc != NULL); - } - - wasm_val_t args[] = { WASM_I32_VAL(size) }; - wasm_val_t results[1]; - wasm_val_vec_t args_arr = WASM_ARRAY_VEC(args); - wasm_val_vec_t results_arr = WASM_ARRAY_VEC(results); - - runtime->wasm_func_call(stbi_heap_alloc, &args_arr, &results_arr); - return ONYX_PTR(results[0].of.i32); -} - -static wasm_func_t* stbi_heap_resize = NULL; -static void *__onyx_stbi_heap_resize_wrapper(void* ptr, int size) { - if (stbi_heap_resize == NULL) { - wasm_extern_t *stbi_heap_resize_extern = runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, "stbi_heap_resize"); - stbi_heap_resize = runtime->wasm_extern_as_func(stbi_heap_resize_extern); - } - - int onyx_ptr = 0; - if (ptr != NULL) onyx_ptr = (int) ((char*) ptr - runtime->wasm_memory_data(runtime->wasm_memory)); - - wasm_val_t args[] = { WASM_I32_VAL(onyx_ptr), WASM_I32_VAL(size) }; - wasm_val_t results[1]; - wasm_val_vec_t args_arr = WASM_ARRAY_VEC(args); - wasm_val_vec_t results_arr = WASM_ARRAY_VEC(results); - - runtime->wasm_func_call(stbi_heap_resize, &args_arr, &results_arr); - return ONYX_PTR(results[0].of.i32); -} - -static wasm_func_t* stbi_heap_free = NULL; -static void __onyx_stbi_heap_free_wrapper(void *ptr) { - if (stbi_heap_free == NULL) { - wasm_extern_t *stbi_heap_free_extern = runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, "stbi_heap_free"); - stbi_heap_free = runtime->wasm_extern_as_func(stbi_heap_free_extern); - } - - if (ptr == NULL) return; - - int onyx_ptr = (int) ((char*) ptr - runtime->wasm_memory_data(runtime->wasm_memory)); - - wasm_val_t args[] = { WASM_I32_VAL(onyx_ptr) }; - wasm_val_vec_t results = {0,0}; - wasm_val_vec_t args_arr = WASM_ARRAY_VEC(args); - - runtime->wasm_func_call(stbi_heap_free, &args_arr, &results); -} - -#define STBI_MALLOC(s) __onyx_stbi_heap_alloc_wrapper(s) -#define STBI_REALLOC(p,newsz) __onyx_stbi_heap_resize_wrapper(p,newsz) -#define STBI_FREE(p) __onyx_stbi_heap_free_wrapper(p) - -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - -#define PTR WASM_I32 -#define INT WASM_I32 -#define FLOAT WASM_F32 -#define PARAM(n, k) (params->data[n].of.k) - -ONYX_DEF(stbi_load, (PTR, PTR, PTR, PTR, INT), (PTR)) { - unsigned char *data = stbi_load( - (char *) ONYX_PTR(PARAM(0, i32)), - (int *) ONYX_PTR(PARAM(1, i32)), - (int *) ONYX_PTR(PARAM(2, i32)), - (int *) ONYX_PTR(PARAM(3, i32)), - PARAM(4, i32)); - - if (data == NULL) results->data[0] = WASM_I32_VAL(0); - else results->data[0] = WASM_I32_VAL(data - (unsigned char *) runtime->wasm_memory_data(runtime->wasm_memory)); - return NULL; -} - -ONYX_DEF(stbi_load_from_memory, (PTR, INT, PTR, PTR, PTR, INT), (PTR)) { - unsigned char *data = stbi_load_from_memory( - (unsigned char *) ONYX_PTR(PARAM(0, i32)), - PARAM(1, i32), - (int *) ONYX_PTR(PARAM(2, i32)), - (int *) ONYX_PTR(PARAM(3, i32)), - (int *) ONYX_PTR(PARAM(4, i32)), - PARAM(5, i32)); - - if (data == NULL) results->data[0] = WASM_I32_VAL(0); - else results->data[0] = WASM_I32_VAL(data - (unsigned char *) runtime->wasm_memory_data(runtime->wasm_memory)); - return NULL; -} - -ONYX_DEF(stbi_load_gif_from_memory, (PTR, INT, PTR, PTR, PTR, PTR, PTR, INT), (PTR)) { - unsigned char *data = stbi_load_gif_from_memory( - (unsigned char *) ONYX_PTR(PARAM(0, i32)), - PARAM(1, i32), - (int **) ONYX_PTR(PARAM(2, i32)), - (int *) ONYX_PTR(PARAM(3, i32)), - (int *) ONYX_PTR(PARAM(4, i32)), - (int *) ONYX_PTR(PARAM(5, i32)), - (int *) ONYX_PTR(PARAM(6, i32)), - PARAM(7, i32)); - - if (data == NULL) results->data[0] = WASM_I32_VAL(0); - else results->data[0] = WASM_I32_VAL(data - (unsigned char *) runtime->wasm_memory_data(runtime->wasm_memory)); - return NULL; -} - -ONYX_DEF(stbi_image_free, (PTR), ()) { - stbi_image_free(ONYX_PTR(PARAM(0, i32))); - return NULL; -} - -ONYX_LIBRARY { - ONYX_FUNC(stbi_load) - ONYX_FUNC(stbi_load_from_memory) - ONYX_FUNC(stbi_load_gif_from_memory) - ONYX_FUNC(stbi_image_free) - - NULL -}; diff --git a/modules/stb_image/stb_image.h b/modules/stb_image/stb_image.h deleted file mode 100644 index d60371b9..00000000 --- a/modules/stb_image/stb_image.h +++ /dev/null @@ -1,7897 +0,0 @@ -/* stb_image - v2.27 - 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.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes - 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 Simon Breuss (16-bit PNM) - 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 - Eugene Golushkov 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 github:mosra - Luca Sas Alexander Veselov Zack Middleton [reserved] - Ryan C. Gordon [reserved] [reserved] - DO NOT ADD YOUR NAME HERE - - Jacko Dirks - - 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. -// -// To query the width, height and component count of an image without having to -// decode the full file, you can use the stbi_info family of functions: -// -// int x,y,n,ok; -// ok = stbi_info(filename, &x, &y, &n); -// // returns ok=1 and sets x, y, n if image is a supported format, -// // 0 otherwise. -// -// Note that stb_image pervasively uses ints in its public API for sizes, -// including sizes of memory buffers. This is now part of the API and thus -// hard to change without causing breakage. As a result, the various image -// loaders all have certain limits on image size; these differ somewhat -// by format but generally boil down to either just under 2GB or just under -// 1GB. When the decoded image would be larger than this, stb_image decoding -// will fail. -// -// Additionally, stb_image will reject image files that have any of their -// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, -// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, -// the only way to have an image with such dimensions load correctly -// is for it to have a rather extreme aspect ratio. Either way, the -// assumption here is that such larger images are likely to be malformed -// or malicious. If you do need to load an image with individual dimensions -// larger than that, and it still fits in the overall size limit, you can -// #define STBI_MAX_DIMENSIONS on your own to be something larger. -// -// =========================================================================== -// -// 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: -// -// We optionally support converting iPhone-formatted PNGs (which store -// premultiplied BGRA) back to RGB, even though they're internally encoded -// differently. To enable this conversion, call -// stbi_convert_iphone_png_to_rgb(1). -// -// 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_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); -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) >> (-(y) & 31))) -#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 -#ifdef _MSC_VER -#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name -#else -#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) -#endif -#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); -static int stbi__pnm_is16(stbi__context *s); -#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) || !defined(STBI_NO_PNM) -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) || !defined(STBI_NO_PNM) -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; - - // test the formats with a very explicit header first (at least a FOURCC - // or distinctive magic number first) - #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 - - // then the formats that can end up attempting to load with just 1 or 2 - // bytes matching expectations; these are prone to false positives, so - // try them later - #ifndef STBI_NO_JPEG - if (stbi__jpeg_test(s)) return stbi__jpeg_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(_WIN32) && 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(_WIN32) && 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(_WIN32) && defined(STBI_WINDOWS_UTF8) - wchar_t wMode[64]; - wchar_t wFilename[1024]; - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) - return 0; - - if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) - return 0; - -#if defined(_MSC_VER) && _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); - z += (stbi__uint32)stbi__get16le(s) << 16; - return z; -} -#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 = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) - 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__jbias[n] & (sgn - 1)); -} - -// 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 || t > 15) 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 < 0 || t > 15) 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 * (1 << 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) * (1 << 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) * (1 << 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; - } - - // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios - // and I've never seen a non-corrupted JPEG file actually use them - for (i=0; i < s->img_n; ++i) { - if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); - if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); - } - - // 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; - - // nothing to do if no components requested; check this now to avoid - // accessing uninitialized coutput[0] later - if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } - - // 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)); - if (!j) return stbi__errpuc("outofmem", "Out of memory"); - 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)); - if (!j) return stbi__err("outofmem", "Out of memory"); - 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))); - if (!j) return stbi__err("outofmem", "Out of memory"); - 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) -#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet - -// 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[STBI__ZNSYMS]; - stbi__uint16 value[STBI__ZNSYMS]; -} 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 >= STBI__ZNSYMS) 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[STBI__ZNSYMS] = -{ - 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 , STBI__ZNSYMS)) 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); - if (!final) return stbi__err("outofmem", "Out of memory"); - 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_global = 0; -static int stbi__de_iphone_flag_global = 0; - -STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_global = flag_true_if_should_convert; -} - -#ifndef STBI_THREAD_LOCAL -#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global -#define stbi__de_iphone_flag stbi__de_iphone_flag_global -#else -static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; -static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; - -STBIDEF void stbi__unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) -{ - stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; - stbi__unpremultiply_on_load_set = 1; -} - -STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) -{ - stbi__de_iphone_flag_local = flag_true_if_should_convert; - stbi__de_iphone_flag_set = 1; -} - -#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ - ? stbi__unpremultiply_on_load_local \ - : stbi__unpremultiply_on_load_global) -#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ - ? stbi__de_iphone_flag_local \ - : stbi__de_iphone_flag_global) -#endif // STBI_THREAD_LOCAL - -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 int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) -{ - // BI_BITFIELDS specifies masks explicitly, don't override - if (compress == 3) - return 1; - - if (compress == 0) { - if (info->bpp == 16) { - info->mr = 31u << 10; - info->mg = 31u << 5; - info->mb = 31u << 0; - } else 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 { - // otherwise, use defaults, which is all-0 - info->mr = info->mg = info->mb = info->ma = 0; - } - return 1; - } - return 0; // error -} - -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"); - if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes - if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel - 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) { - stbi__bmp_set_mask_defaults(info, compress); - } 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 { - // V4/V5 header - 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); - if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs - stbi__bmp_set_mask_defaults(info, compress); - 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) { - if (info.offset != s->callback_already_read + (s->img_buffer - s->img_buffer_original)) { - 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); - if (!result) return stbi__errpuc("outofmem", "Out of memory"); - 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 (!g) return stbi__err("outofmem", "Out of memory"); - 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_outofmem(stbi__gif *g, stbi_uc *out, int **delays) -{ - STBI_FREE(g->out); - STBI_FREE(g->history); - STBI_FREE(g->background); - - if (out) STBI_FREE(out); - if (delays && *delays) STBI_FREE(*delays); - return stbi__errpuc("outofmem", "Out of memory"); -} - -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; - - STBI_NOTUSED(out_size); - STBI_NOTUSED(delays_size); - - 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 (!tmp) - return stbi__load_gif_main_outofmem(&g, out, delays); - else { - out = (stbi_uc*) tmp; - out_size = layers * stride; - } - - if (delays) { - int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); - if (!new_delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - *delays = new_delays; - delays_size = layers * sizeof(int); - } - } else { - out = (stbi_uc*)stbi__malloc( layers * stride ); - if (!out) - return stbi__load_gif_main_outofmem(&g, out, delays); - out_size = layers * stride; - if (delays) { - *delays = (int*) stbi__malloc( layers * sizeof(int) ); - if (!*delays) - return stbi__load_gif_main_outofmem(&g, out, delays); - 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); - if (p == NULL) { - stbi__rewind( s ); - 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; - } - STBI_NOTUSED(stbi__get32be(s)); - STBI_NOTUSED(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) - -#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); - - ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); - if (ri->bits_per_channel == 0) - 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__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) - return stbi__errpuc("too large", "PNM too large"); - - out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); - if (!out) return stbi__errpuc("outofmem", "Out of memory"); - stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8)); - - 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 > 65535) - return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); - else if (maxv > 255) - return 16; - else - return 8; -} - -static int stbi__pnm_is16(stbi__context *s) -{ - if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) - return 1; - return 0; -} -#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 - - #ifndef STBI_NO_PNM - if (stbi__pnm_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/modules/stb_image/stb_image.so b/modules/stb_image/stb_image.so deleted file mode 100755 index a33bd17e..00000000 Binary files a/modules/stb_image/stb_image.so and /dev/null differ diff --git a/modules/stb_truetype/build.onyx b/modules/stb_truetype/build.onyx deleted file mode 100644 index 42108f14..00000000 --- a/modules/stb_truetype/build.onyx +++ /dev/null @@ -1,10 +0,0 @@ -#load "scripts/c_library" -use package core - -main :: (args) => { - path := module_path(#file); - - compile_c_file( - string.concat(path, "stb_truetype.c"), - string.concat(path, "stb_truetype.so")); -} \ No newline at end of file diff --git a/modules/stb_truetype/module.onyx b/modules/stb_truetype/module.onyx deleted file mode 100644 index a2be6c40..00000000 --- a/modules/stb_truetype/module.onyx +++ /dev/null @@ -1,28 +0,0 @@ -package stb_truetype - -#library "stb_truetype" - -stbtt_pack_context :: struct #size 64 {} - -stbtt_packedchar :: struct #size 28 { - x0, y0, x1, y1: u16; - xoff, yoff, xadvance: f32; - xoff2, yoff2: f32; -} - -stbtt_aligned_quad :: struct #size 32 { - x0, y0, s0, t0 : f32; - x1, y1, s1, t1 : f32; -} - -#foreign "stb_truetype" { - stbtt_PackBegin :: (ctx: ^stbtt_pack_context, pixels: ^u8, width, height, stride_in_bytes, padding: i32) -> i32 --- - stbtt_PackEnd :: (ctx: ^stbtt_pack_context) -> void --- - stbtt_PackFontRange :: (ctx: ^stbtt_pack_context, fontdata: ^u8, font_index: i32, font_size: f32, first_unicode_char_in_range: i32, num_chars_in_range: i32, chardata_for_range: ^stbtt_packedchar) -> i32 --- - stbtt_PackSetOversampling :: (ctx: ^stbtt_pack_context, h_oversample, v_oversample: i32) -> void --- - - stbtt_GetPackedQuad :: (chardata: ^stbtt_packedchar, pw, ph: i32, char_index: i32, xpos, ypos: ^f32, quad: ^stbtt_aligned_quad, align_to_integer: bool) -> void --- -} - -#export "stbtt_heap_alloc" calloc -#export "stbtt_heap_free" cfree diff --git a/modules/stb_truetype/stb_rect_pack.h b/modules/stb_truetype/stb_rect_pack.h deleted file mode 100644 index ab24c488..00000000 --- a/modules/stb_truetype/stb_rect_pack.h +++ /dev/null @@ -1,623 +0,0 @@ -// stb_rect_pack.h - v1.01 - public domain - rectangle packing -// Sean Barrett 2014 -// -// Useful for e.g. packing rectangular textures into an atlas. -// Does not do rotation. -// -// Before #including, -// -// #define STB_RECT_PACK_IMPLEMENTATION -// -// in the file that you want to have the implementation. -// -// Not necessarily the awesomest packing method, but better than -// the totally naive one in stb_truetype (which is primarily what -// this is meant to replace). -// -// Has only had a few tests run, may have issues. -// -// More docs to come. -// -// No memory allocations; uses qsort() and assert() from stdlib. -// Can override those by defining STBRP_SORT and STBRP_ASSERT. -// -// This library currently uses the Skyline Bottom-Left algorithm. -// -// Please note: better rectangle packers are welcome! Please -// implement them to the same API, but with a different init -// function. -// -// Credits -// -// Library -// Sean Barrett -// Minor features -// Martins Mozeiko -// github:IntellectualKitty -// -// Bugfixes / warning fixes -// Jeremy Jaussaud -// Fabian Giesen -// -// Version history: -// -// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section -// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles -// 0.99 (2019-02-07) warning fixes -// 0.11 (2017-03-03) return packing success/fail result -// 0.10 (2016-10-25) remove cast-away-const to avoid warnings -// 0.09 (2016-08-27) fix compiler warnings -// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) -// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) -// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort -// 0.05: added STBRP_ASSERT to allow replacing assert -// 0.04: fixed minor bug in STBRP_LARGE_RECTS support -// 0.01: initial release -// -// LICENSE -// -// See end of file for license information. - -////////////////////////////////////////////////////////////////////////////// -// -// INCLUDE SECTION -// - -#ifndef STB_INCLUDE_STB_RECT_PACK_H -#define STB_INCLUDE_STB_RECT_PACK_H - -#define STB_RECT_PACK_VERSION 1 - -#ifdef STBRP_STATIC -#define STBRP_DEF static -#else -#define STBRP_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct stbrp_context stbrp_context; -typedef struct stbrp_node stbrp_node; -typedef struct stbrp_rect stbrp_rect; - -typedef int stbrp_coord; - -#define STBRP__MAXVAL 0x7fffffff -// Mostly for internal use, but this is the maximum supported coordinate value. - -STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); -// Assign packed locations to rectangles. The rectangles are of type -// 'stbrp_rect' defined below, stored in the array 'rects', and there -// are 'num_rects' many of them. -// -// Rectangles which are successfully packed have the 'was_packed' flag -// set to a non-zero value and 'x' and 'y' store the minimum location -// on each axis (i.e. bottom-left in cartesian coordinates, top-left -// if you imagine y increasing downwards). Rectangles which do not fit -// have the 'was_packed' flag set to 0. -// -// You should not try to access the 'rects' array from another thread -// while this function is running, as the function temporarily reorders -// the array while it executes. -// -// To pack into another rectangle, you need to call stbrp_init_target -// again. To continue packing into the same rectangle, you can call -// this function again. Calling this multiple times with multiple rect -// arrays will probably produce worse packing results than calling it -// a single time with the full rectangle array, but the option is -// available. -// -// The function returns 1 if all of the rectangles were successfully -// packed and 0 otherwise. - -struct stbrp_rect -{ - // reserved for your use: - int id; - - // input: - stbrp_coord w, h; - - // output: - stbrp_coord x, y; - int was_packed; // non-zero if valid packing - -}; // 16 bytes, nominally - - -STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes); -// Initialize a rectangle packer to: -// pack a rectangle that is 'width' by 'height' in dimensions -// using temporary storage provided by the array 'nodes', which is 'num_nodes' long -// -// You must call this function every time you start packing into a new target. -// -// There is no "shutdown" function. The 'nodes' memory must stay valid for -// the following stbrp_pack_rects() call (or calls), but can be freed after -// the call (or calls) finish. -// -// Note: to guarantee best results, either: -// 1. make sure 'num_nodes' >= 'width' -// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' -// -// If you don't do either of the above things, widths will be quantized to multiples -// of small integers to guarantee the algorithm doesn't run out of temporary storage. -// -// If you do #2, then the non-quantized algorithm will be used, but the algorithm -// may run out of temporary storage and be unable to pack some rectangles. - -STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem); -// Optionally call this function after init but before doing any packing to -// change the handling of the out-of-temp-memory scenario, described above. -// If you call init again, this will be reset to the default (false). - - -STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic); -// Optionally select which packing heuristic the library should use. Different -// heuristics will produce better/worse results for different data sets. -// If you call init again, this will be reset to the default. - -enum -{ - STBRP_HEURISTIC_Skyline_default=0, - STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, - STBRP_HEURISTIC_Skyline_BF_sortHeight -}; - - -////////////////////////////////////////////////////////////////////////////// -// -// the details of the following structures don't matter to you, but they must -// be visible so you can handle the memory allocations for them - -struct stbrp_node -{ - stbrp_coord x,y; - stbrp_node *next; -}; - -struct stbrp_context -{ - int width; - int height; - int align; - int init_mode; - int heuristic; - int num_nodes; - stbrp_node *active_head; - stbrp_node *free_head; - stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' -}; - -#ifdef __cplusplus -} -#endif - -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// IMPLEMENTATION SECTION -// - -#ifdef STB_RECT_PACK_IMPLEMENTATION -#ifndef STBRP_SORT -#include -#define STBRP_SORT qsort -#endif - -#ifndef STBRP_ASSERT -#include -#define STBRP_ASSERT assert -#endif - -#ifdef _MSC_VER -#define STBRP__NOTUSED(v) (void)(v) -#define STBRP__CDECL __cdecl -#else -#define STBRP__NOTUSED(v) (void)sizeof(v) -#define STBRP__CDECL -#endif - -enum -{ - STBRP__INIT_skyline = 1 -}; - -STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic) -{ - switch (context->init_mode) { - case STBRP__INIT_skyline: - STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); - context->heuristic = heuristic; - break; - default: - STBRP_ASSERT(0); - } -} - -STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem) -{ - if (allow_out_of_mem) - // if it's ok to run out of memory, then don't bother aligning them; - // this gives better packing, but may fail due to OOM (even though - // the rectangles easily fit). @TODO a smarter approach would be to only - // quantize once we've hit OOM, then we could get rid of this parameter. - context->align = 1; - else { - // if it's not ok to run out of memory, then quantize the widths - // so that num_nodes is always enough nodes. - // - // I.e. num_nodes * align >= width - // align >= width / num_nodes - // align = ceil(width/num_nodes) - - context->align = (context->width + context->num_nodes-1) / context->num_nodes; - } -} - -STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) -{ - int i; - - for (i=0; i < num_nodes-1; ++i) - nodes[i].next = &nodes[i+1]; - nodes[i].next = NULL; - context->init_mode = STBRP__INIT_skyline; - context->heuristic = STBRP_HEURISTIC_Skyline_default; - context->free_head = &nodes[0]; - context->active_head = &context->extra[0]; - context->width = width; - context->height = height; - context->num_nodes = num_nodes; - stbrp_setup_allow_out_of_mem(context, 0); - - // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) - context->extra[0].x = 0; - context->extra[0].y = 0; - context->extra[0].next = &context->extra[1]; - context->extra[1].x = (stbrp_coord) width; - context->extra[1].y = (1<<30); - context->extra[1].next = NULL; -} - -// find minimum y position if it starts at x1 -static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste) -{ - stbrp_node *node = first; - int x1 = x0 + width; - int min_y, visited_width, waste_area; - - STBRP__NOTUSED(c); - - STBRP_ASSERT(first->x <= x0); - - #if 0 - // skip in case we're past the node - while (node->next->x <= x0) - ++node; - #else - STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency - #endif - - STBRP_ASSERT(node->x <= x0); - - min_y = 0; - waste_area = 0; - visited_width = 0; - while (node->x < x1) { - if (node->y > min_y) { - // raise min_y higher. - // we've accounted for all waste up to min_y, - // but we'll now add more waste for everything we've visted - waste_area += visited_width * (node->y - min_y); - min_y = node->y; - // the first time through, visited_width might be reduced - if (node->x < x0) - visited_width += node->next->x - x0; - else - visited_width += node->next->x - node->x; - } else { - // add waste area - int under_width = node->next->x - node->x; - if (under_width + visited_width > width) - under_width = width - visited_width; - waste_area += under_width * (min_y - node->y); - visited_width += under_width; - } - node = node->next; - } - - *pwaste = waste_area; - return min_y; -} - -typedef struct -{ - int x,y; - stbrp_node **prev_link; -} stbrp__findresult; - -static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height) -{ - int best_waste = (1<<30), best_x, best_y = (1 << 30); - stbrp__findresult fr; - stbrp_node **prev, *node, *tail, **best = NULL; - - // align to multiple of c->align - width = (width + c->align - 1); - width -= width % c->align; - STBRP_ASSERT(width % c->align == 0); - - // if it can't possibly fit, bail immediately - if (width > c->width || height > c->height) { - fr.prev_link = NULL; - fr.x = fr.y = 0; - return fr; - } - - node = c->active_head; - prev = &c->active_head; - while (node->x + width <= c->width) { - int y,waste; - y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); - if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL - // bottom left - if (y < best_y) { - best_y = y; - best = prev; - } - } else { - // best-fit - if (y + height <= c->height) { - // can only use it if it first vertically - if (y < best_y || (y == best_y && waste < best_waste)) { - best_y = y; - best_waste = waste; - best = prev; - } - } - } - prev = &node->next; - node = node->next; - } - - best_x = (best == NULL) ? 0 : (*best)->x; - - // if doing best-fit (BF), we also have to try aligning right edge to each node position - // - // e.g, if fitting - // - // ____________________ - // |____________________| - // - // into - // - // | | - // | ____________| - // |____________| - // - // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned - // - // This makes BF take about 2x the time - - if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { - tail = c->active_head; - node = c->active_head; - prev = &c->active_head; - // find first node that's admissible - while (tail->x < width) - tail = tail->next; - while (tail) { - int xpos = tail->x - width; - int y,waste; - STBRP_ASSERT(xpos >= 0); - // find the left position that matches this - while (node->next->x <= xpos) { - prev = &node->next; - node = node->next; - } - STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); - y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); - if (y + height <= c->height) { - if (y <= best_y) { - if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { - best_x = xpos; - STBRP_ASSERT(y <= best_y); - best_y = y; - best_waste = waste; - best = prev; - } - } - } - tail = tail->next; - } - } - - fr.prev_link = best; - fr.x = best_x; - fr.y = best_y; - return fr; -} - -static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height) -{ - // find best position according to heuristic - stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); - stbrp_node *node, *cur; - - // bail if: - // 1. it failed - // 2. the best node doesn't fit (we don't always check this) - // 3. we're out of memory - if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { - res.prev_link = NULL; - return res; - } - - // on success, create new node - node = context->free_head; - node->x = (stbrp_coord) res.x; - node->y = (stbrp_coord) (res.y + height); - - context->free_head = node->next; - - // insert the new node into the right starting point, and - // let 'cur' point to the remaining nodes needing to be - // stiched back in - - cur = *res.prev_link; - if (cur->x < res.x) { - // preserve the existing one, so start testing with the next one - stbrp_node *next = cur->next; - cur->next = node; - cur = next; - } else { - *res.prev_link = node; - } - - // from here, traverse cur and free the nodes, until we get to one - // that shouldn't be freed - while (cur->next && cur->next->x <= res.x + width) { - stbrp_node *next = cur->next; - // move the current node to the free list - cur->next = context->free_head; - context->free_head = cur; - cur = next; - } - - // stitch the list back in - node->next = cur; - - if (cur->x < res.x + width) - cur->x = (stbrp_coord) (res.x + width); - -#ifdef _DEBUG - cur = context->active_head; - while (cur->x < context->width) { - STBRP_ASSERT(cur->x < cur->next->x); - cur = cur->next; - } - STBRP_ASSERT(cur->next == NULL); - - { - int count=0; - cur = context->active_head; - while (cur) { - cur = cur->next; - ++count; - } - cur = context->free_head; - while (cur) { - cur = cur->next; - ++count; - } - STBRP_ASSERT(count == context->num_nodes+2); - } -#endif - - return res; -} - -static int STBRP__CDECL rect_height_compare(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - if (p->h > q->h) - return -1; - if (p->h < q->h) - return 1; - return (p->w > q->w) ? -1 : (p->w < q->w); -} - -static int STBRP__CDECL rect_original_order(const void *a, const void *b) -{ - const stbrp_rect *p = (const stbrp_rect *) a; - const stbrp_rect *q = (const stbrp_rect *) b; - return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); -} - -STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) -{ - int i, all_rects_packed = 1; - - // we use the 'was_packed' field internally to allow sorting/unsorting - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = i; - } - - // sort according to heuristic - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); - - for (i=0; i < num_rects; ++i) { - if (rects[i].w == 0 || rects[i].h == 0) { - rects[i].x = rects[i].y = 0; // empty rect needs no space - } else { - stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); - if (fr.prev_link) { - rects[i].x = (stbrp_coord) fr.x; - rects[i].y = (stbrp_coord) fr.y; - } else { - rects[i].x = rects[i].y = STBRP__MAXVAL; - } - } - } - - // unsort - STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); - - // set was_packed flags and all_rects_packed status - for (i=0; i < num_rects; ++i) { - rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); - if (!rects[i].was_packed) - all_rects_packed = 0; - } - - // return the all_rects_packed status - return all_rects_packed; -} -#endif - -/* ------------------------------------------------------------------------------- -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. ------------------------------------------------------------------------------- -*/ \ No newline at end of file diff --git a/modules/stb_truetype/stb_truetype.c b/modules/stb_truetype/stb_truetype.c deleted file mode 100644 index 0ae528aa..00000000 --- a/modules/stb_truetype/stb_truetype.c +++ /dev/null @@ -1,90 +0,0 @@ -#define ONYX_LIBRARY_NAME stb_truetype -#include "onyx_library.h" - -static wasm_func_t* heap_alloc = NULL; -static void *__onyx_heap_alloc_wrapper(int size, void* userdata) { - if (heap_alloc == NULL) { - wasm_extern_t *heap_alloc_extern = runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, "stbtt_heap_alloc"); - heap_alloc = runtime->wasm_extern_as_func(heap_alloc_extern); - } - - wasm_val_t args[] = { WASM_I32_VAL(size) }; - wasm_val_t results[1]; - wasm_val_vec_t args_arr = WASM_ARRAY_VEC(args); - wasm_val_vec_t results_arr = WASM_ARRAY_VEC(results); - - runtime->wasm_func_call(heap_alloc, &args_arr, &results_arr); - return ONYX_PTR(results[0].of.i32); -} - -static wasm_func_t* heap_free = NULL; -static void __onyx_heap_free_wrapper(void *ptr, void* userdata) { - if (heap_free == NULL) { - wasm_extern_t *heap_free_extern = runtime->wasm_extern_lookup_by_name(runtime->wasm_module, runtime->wasm_instance, "stbtt_heap_free"); - heap_free = runtime->wasm_extern_as_func(heap_free_extern); - } - - int onyx_ptr = (int) ((char*) ptr - runtime->wasm_memory_data(runtime->wasm_memory)); - - wasm_val_t args[] = { WASM_I32_VAL(onyx_ptr) }; - wasm_val_vec_t results = {0,0}; - wasm_val_vec_t args_arr = WASM_ARRAY_VEC(args); - - runtime->wasm_func_call(heap_free, &args_arr, &results); -} - -#define STBTT_malloc __onyx_heap_alloc_wrapper -#define STBTT_free __onyx_heap_free_wrapper - -#define STB_TRUETYPE_IMPLEMENTATION -#define STB_RECT_PACK_IMPLEMENTATION -#include "stb_rect_pack.h" -#include "stb_truetype.h" - - -#define PTR WASM_I32 -#define INT WASM_I32 -#define FLOAT WASM_F32 -#define PARAM(n, k) (params->data[n].of.k) - -// -// Only wrapping the small subset of the features that I need. -// -ONYX_DEF(stbtt_PackBegin, (PTR, PTR, INT, INT, INT, INT), (INT)) { - results->data[0] = WASM_I32_VAL(stbtt_PackBegin(ONYX_PTR(PARAM(0, i32)), ONYX_PTR(PARAM(1, i32)), PARAM(2, i32), PARAM(3, i32), PARAM(4, i32), PARAM(5, i32), NULL)); - return NULL; -} - -ONYX_DEF(stbtt_PackEnd, (PTR), ()) { - stbtt_PackEnd(ONYX_PTR(PARAM(0, i32))); - return NULL; -} - -ONYX_DEF(stbtt_PackSetOversampling, (PTR, INT, INT), ()) { - stbtt_PackSetOversampling(ONYX_PTR(PARAM(0, i32)), PARAM(1, i32), PARAM(2, i32)); - return NULL; -} - -ONYX_DEF(stbtt_PackFontRange, (PTR, PTR, INT, FLOAT, INT, INT, PTR), (INT)) { - results->data[0] = WASM_I32_VAL( - stbtt_PackFontRange(ONYX_PTR(PARAM(0, i32)), ONYX_PTR(PARAM(1, i32)), - PARAM(2, i32), PARAM(3, f32), PARAM(4, i32), PARAM(5, i32), ONYX_PTR(PARAM(6, i32))) - ); - - return NULL; -} - -ONYX_DEF(stbtt_GetPackedQuad, (PTR, INT, INT, INT, PTR, PTR, PTR, INT), ()) { - stbtt_GetPackedQuad(ONYX_PTR(PARAM(0, i32)), PARAM(1, i32), PARAM(2, i32), PARAM(3, i32), ONYX_PTR(PARAM(4, i32)), ONYX_PTR(PARAM(5, i32)), ONYX_PTR(PARAM(6, i32)), PARAM(7, i32)); - return NULL; -} - -ONYX_LIBRARY { - ONYX_FUNC(stbtt_PackBegin) - ONYX_FUNC(stbtt_PackEnd) - ONYX_FUNC(stbtt_PackSetOversampling) - ONYX_FUNC(stbtt_PackFontRange) - ONYX_FUNC(stbtt_GetPackedQuad) - - NULL -}; diff --git a/modules/stb_truetype/stb_truetype.h b/modules/stb_truetype/stb_truetype.h deleted file mode 100644 index 5e2a2e48..00000000 --- a/modules/stb_truetype/stb_truetype.h +++ /dev/null @@ -1,5077 +0,0 @@ -// stb_truetype.h - v1.26 - public domain -// authored from 2009-2021 by Sean Barrett / RAD Game Tools -// -// ======================================================================= -// -// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES -// -// This library does no range checking of the offsets found in the file, -// meaning an attacker can use it to read arbitrary memory. -// -// ======================================================================= -// -// This library processes TrueType files: -// parse files -// extract glyph metrics -// extract glyph shapes -// render glyphs to one-channel bitmaps with antialiasing (box filter) -// render glyphs to one-channel SDF bitmaps (signed-distance field/function) -// -// Todo: -// non-MS cmaps -// crashproof on bad data -// hinting? (no longer patented) -// cleartype-style AA? -// optimize: use simple memory allocator for intermediates -// optimize: build edge-list directly from curves -// optimize: rasterize directly from curves? -// -// ADDITIONAL CONTRIBUTORS -// -// Mikko Mononen: compound shape support, more cmap formats -// Tor Andersson: kerning, subpixel rendering -// Dougall Johnson: OpenType / Type 2 font handling -// Daniel Ribeiro Maciel: basic GPOS-based kerning -// -// Misc other: -// Ryan Gordon -// Simon Glass -// github:IntellectualKitty -// Imanol Celaya -// Daniel Ribeiro Maciel -// -// Bug/warning reports/fixes: -// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe -// Cass Everitt Martins Mozeiko github:aloucks -// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam -// Brian Hook Omar Cornut github:vassvik -// Walter van Niftrik Ryan Griege -// David Gow Peter LaValle -// David Given Sergey Popov -// Ivan-Assen Ivanov Giumo X. Clanjor -// Anthony Pesch Higor Euripedes -// Johan Duparc Thomas Fields -// Hou Qiming Derek Vinyard -// Rob Loach Cort Stratton -// Kenney Phillis Jr. Brian Costabile -// Ken Voskuil (kaesve) -// -// VERSION HISTORY -// -// 1.26 (2021-08-28) fix broken rasterizer -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// variant PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// -// Full history can be found at the end of this file. -// -// LICENSE -// -// See end of file for license information. -// -// USAGE -// -// Include this file in whatever places need to refer to it. In ONE C/C++ -// file, write: -// #define STB_TRUETYPE_IMPLEMENTATION -// before the #include of this file. This expands out the actual -// implementation into that C/C++ file. -// -// To make the implementation private to the file that generates the implementation, -// #define STBTT_STATIC -// -// Simple 3D API (don't ship this, but it's fine for tools and quick start) -// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture -// stbtt_GetBakedQuad() -- compute quad to draw for a given char -// -// Improved 3D API (more shippable): -// #include "stb_rect_pack.h" -- optional, but you really want it -// stbtt_PackBegin() -// stbtt_PackSetOversampling() -- for improved quality on small fonts -// stbtt_PackFontRanges() -- pack and renders -// stbtt_PackEnd() -// stbtt_GetPackedQuad() -// -// "Load" a font file from a memory buffer (you have to keep the buffer loaded) -// stbtt_InitFont() -// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections -// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections -// -// Render a unicode codepoint to a bitmap -// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap -// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide -// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be -// -// Character advance/positioning -// stbtt_GetCodepointHMetrics() -// stbtt_GetFontVMetrics() -// stbtt_GetFontVMetricsOS2() -// stbtt_GetCodepointKernAdvance() -// -// Starting with version 1.06, the rasterizer was replaced with a new, -// faster and generally-more-precise rasterizer. The new rasterizer more -// accurately measures pixel coverage for anti-aliasing, except in the case -// where multiple shapes overlap, in which case it overestimates the AA pixel -// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If -// this turns out to be a problem, you can re-enable the old rasterizer with -// #define STBTT_RASTERIZER_VERSION 1 -// which will incur about a 15% speed hit. -// -// ADDITIONAL DOCUMENTATION -// -// Immediately after this block comment are a series of sample programs. -// -// After the sample programs is the "header file" section. This section -// includes documentation for each API function. -// -// Some important concepts to understand to use this library: -// -// Codepoint -// Characters are defined by unicode codepoints, e.g. 65 is -// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is -// the hiragana for "ma". -// -// Glyph -// A visual character shape (every codepoint is rendered as -// some glyph) -// -// Glyph index -// A font-specific integer ID representing a glyph -// -// Baseline -// Glyph shapes are defined relative to a baseline, which is the -// bottom of uppercase characters. Characters extend both above -// and below the baseline. -// -// Current Point -// As you draw text to the screen, you keep track of a "current point" -// which is the origin of each character. The current point's vertical -// position is the baseline. Even "baked fonts" use this model. -// -// Vertical Font Metrics -// The vertical qualities of the font, used to vertically position -// and space the characters. See docs for stbtt_GetFontVMetrics. -// -// Font Size in Pixels or Points -// The preferred interface for specifying font sizes in stb_truetype -// is to specify how tall the font's vertical extent should be in pixels. -// If that sounds good enough, skip the next paragraph. -// -// Most font APIs instead use "points", which are a common typographic -// measurement for describing font size, defined as 72 points per inch. -// stb_truetype provides a point API for compatibility. However, true -// "per inch" conventions don't make much sense on computer displays -// since different monitors have different number of pixels per -// inch. For example, Windows traditionally uses a convention that -// there are 96 pixels per inch, thus making 'inch' measurements have -// nothing to do with inches, and thus effectively defining a point to -// be 1.333 pixels. Additionally, the TrueType font data provides -// an explicit scale factor to scale a given font's glyphs to points, -// but the author has observed that this scale factor is often wrong -// for non-commercial fonts, thus making fonts scaled in points -// according to the TrueType spec incoherently sized in practice. -// -// DETAILED USAGE: -// -// Scale: -// Select how high you want the font to be, in points or pixels. -// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute -// a scale factor SF that will be used by all other functions. -// -// Baseline: -// You need to select a y-coordinate that is the baseline of where -// your text will appear. Call GetFontBoundingBox to get the baseline-relative -// bounding box for all characters. SF*-y0 will be the distance in pixels -// that the worst-case character could extend above the baseline, so if -// you want the top edge of characters to appear at the top of the -// screen where y=0, then you would set the baseline to SF*-y0. -// -// Current point: -// Set the current point where the first character will appear. The -// first character could extend left of the current point; this is font -// dependent. You can either choose a current point that is the leftmost -// point and hope, or add some padding, or check the bounding box or -// left-side-bearing of the first character to be displayed and set -// the current point based on that. -// -// Displaying a character: -// Compute the bounding box of the character. It will contain signed values -// relative to . I.e. if it returns x0,y0,x1,y1, -// then the character should be displayed in the rectangle from -// to = 32 && *text < 128) { - stbtt_aligned_quad q; - stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); - } - ++text; - } - glEnd(); -} -#endif -// -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program (this compiles): get a single bitmap, print as ASCII art -// -#if 0 -#include -#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation -#include "stb_truetype.h" - -char ttf_buffer[1<<25]; - -int main(int argc, char **argv) -{ - stbtt_fontinfo font; - unsigned char *bitmap; - int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); - - fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); - - stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); - bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); - - for (j=0; j < h; ++j) { - for (i=0; i < w; ++i) - putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); - putchar('\n'); - } - return 0; -} -#endif -// -// Output: -// -// .ii. -// @@@@@@. -// V@Mio@@o -// :i. V@V -// :oM@@M -// :@@@MM@M -// @@o o@M -// :@@. M@M -// @@@o@@@@ -// :M@@V:@@. -// -////////////////////////////////////////////////////////////////////////////// -// -// Complete program: print "Hello World!" banner, with bugs -// -#if 0 -char buffer[24<<20]; -unsigned char screen[20][79]; - -int main(int arg, char **argv) -{ - stbtt_fontinfo font; - int i,j,ascent,baseline,ch=0; - float scale, xpos=2; // leave a little padding in case the character extends left - char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness - - fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); - stbtt_InitFont(&font, buffer, 0); - - scale = stbtt_ScaleForPixelHeight(&font, 15); - stbtt_GetFontVMetrics(&font, &ascent,0,0); - baseline = (int) (ascent*scale); - - while (text[ch]) { - int advance,lsb,x0,y0,x1,y1; - float x_shift = xpos - (float) floor(xpos); - stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); - stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); - stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); - // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong - // because this API is really for baking character bitmaps into textures. if you want to render - // a sequence of characters, you really need to render each bitmap to a temp buffer, then - // "alpha blend" that into the working buffer - xpos += (advance * scale); - if (text[ch+1]) - xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); - ++ch; - } - - for (j=0; j < 20; ++j) { - for (i=0; i < 78; ++i) - putchar(" .:ioVM@"[screen[j][i]>>5]); - putchar('\n'); - } - - return 0; -} -#endif - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -//// -//// INTEGRATION WITH YOUR CODEBASE -//// -//// The following sections allow you to supply alternate definitions -//// of C library functions used by stb_truetype, e.g. if you don't -//// link with the C runtime library. - -#ifdef STB_TRUETYPE_IMPLEMENTATION - // #define your own (u)stbtt_int8/16/32 before including to override this - #ifndef stbtt_uint8 - typedef unsigned char stbtt_uint8; - typedef signed char stbtt_int8; - typedef unsigned short stbtt_uint16; - typedef signed short stbtt_int16; - typedef unsigned int stbtt_uint32; - typedef signed int stbtt_int32; - #endif - - typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; - typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; - - // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h - #ifndef STBTT_ifloor - #include - #define STBTT_ifloor(x) ((int) floor(x)) - #define STBTT_iceil(x) ((int) ceil(x)) - #endif - - #ifndef STBTT_sqrt - #include - #define STBTT_sqrt(x) sqrt(x) - #define STBTT_pow(x,y) pow(x,y) - #endif - - #ifndef STBTT_fmod - #include - #define STBTT_fmod(x,y) fmod(x,y) - #endif - - #ifndef STBTT_cos - #include - #define STBTT_cos(x) cos(x) - #define STBTT_acos(x) acos(x) - #endif - - #ifndef STBTT_fabs - #include - #define STBTT_fabs(x) fabs(x) - #endif - - // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h - #ifndef STBTT_malloc - #include - #define STBTT_malloc(x,u) ((void)(u),malloc(x)) - #define STBTT_free(x,u) ((void)(u),free(x)) - #endif - - #ifndef STBTT_assert - #include - #define STBTT_assert(x) assert(x) - #endif - - #ifndef STBTT_strlen - #include - #define STBTT_strlen(x) strlen(x) - #endif - - #ifndef STBTT_memcpy - #include - #define STBTT_memcpy memcpy - #define STBTT_memset memset - #endif -#endif - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// INTERFACE -//// -//// - -#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ -#define __STB_INCLUDE_STB_TRUETYPE_H__ - -#ifdef STBTT_STATIC -#define STBTT_DEF static -#else -#define STBTT_DEF extern -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// private structure -typedef struct -{ - unsigned char *data; - int cursor; - int size; -} stbtt__buf; - -////////////////////////////////////////////////////////////////////////////// -// -// TEXTURE BAKING API -// -// If you use this API, you only have to call two functions ever. -// - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; -} stbtt_bakedchar; - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata); // you allocate this, it's num_chars long -// if return is positive, the first unused row of the bitmap -// if return is negative, returns the negative of the number of characters that fit -// if return is 0, no characters fit and no rows were used -// This uses a very crappy packing. - -typedef struct -{ - float x0,y0,s0,t0; // top-left - float x1,y1,s1,t1; // bottom-right -} stbtt_aligned_quad; - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier -// Call GetBakedQuad with char_index = 'character - first_char', and it -// creates the quad you need to draw and advances the current position. -// -// The coordinate system used assumes y increases downwards. -// -// Characters will extend both above and below the current position; -// see discussion of "BASELINE" above. -// -// It's inefficient; you might want to c&p it and optimize it. - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); -// Query the font vertical metrics without having to create a font first. - - -////////////////////////////////////////////////////////////////////////////// -// -// NEW TEXTURE BAKING API -// -// This provides options for packing multiple fonts into one atlas, not -// perfectly but better than nothing. - -typedef struct -{ - unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap - float xoff,yoff,xadvance; - float xoff2,yoff2; -} stbtt_packedchar; - -typedef struct stbtt_pack_context stbtt_pack_context; -typedef struct stbtt_fontinfo stbtt_fontinfo; -#ifndef STB_RECT_PACK_VERSION -typedef struct stbrp_rect stbrp_rect; -#endif - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); -// Initializes a packing context stored in the passed-in stbtt_pack_context. -// Future calls using this context will pack characters into the bitmap passed -// in here: a 1-channel bitmap that is width * height. stride_in_bytes is -// the distance from one row to the next (or 0 to mean they are packed tightly -// together). "padding" is the amount of padding to leave between each -// character (normally you want '1' for bitmaps you'll use as textures with -// bilinear filtering). -// -// Returns 0 on failure, 1 on success. - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); -// Cleans up the packing context and frees all memory. - -#define STBTT_POINT_SIZE(x) (-(x)) - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); -// Creates character bitmaps from the font_index'th font found in fontdata (use -// font_index=0 if you don't know what that is). It creates num_chars_in_range -// bitmaps for characters with unicode values starting at first_unicode_char_in_range -// and increasing. Data for how to render them is stored in chardata_for_range; -// pass these to stbtt_GetPackedQuad to get back renderable quads. -// -// font_size is the full height of the character from ascender to descender, -// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed -// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() -// and pass that result as 'font_size': -// ..., 20 , ... // font max minus min y is 20 pixels tall -// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall - -typedef struct -{ - float font_size; - int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint - int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints - int num_chars; - stbtt_packedchar *chardata_for_range; // output - unsigned char h_oversample, v_oversample; // don't set these, they're used internally -} stbtt_pack_range; - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); -// Creates character bitmaps from multiple ranges of characters stored in -// ranges. This will usually create a better-packed bitmap than multiple -// calls to stbtt_PackFontRange. Note that you can call this multiple -// times within a single PackBegin/PackEnd. - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); -// Oversampling a font increases the quality by allowing higher-quality subpixel -// positioning, and is especially valuable at smaller text sizes. -// -// This function sets the amount of oversampling for all following calls to -// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given -// pack context. The default (no oversampling) is achieved by h_oversample=1 -// and v_oversample=1. The total number of pixels required is -// h_oversample*v_oversample larger than the default; for example, 2x2 -// oversampling requires 4x the storage of 1x1. For best results, render -// oversampled textures with bilinear filtering. Look at the readme in -// stb/tests/oversample for information about oversampled fonts -// -// To use with PackFontRangesGather etc., you must set it before calls -// call to PackFontRangesGatherRects. - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); -// If skip != 0, this tells stb_truetype to skip any codepoints for which -// there is no corresponding glyph. If skip=0, which is the default, then -// codepoints without a glyph recived the font's "missing character" glyph, -// typically an empty box by convention. - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above - int char_index, // character to display - float *xpos, float *ypos, // pointers to current position in screen pixel space - stbtt_aligned_quad *q, // output: quad to draw - int align_to_integer); - -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); -// Calling these functions in sequence is roughly equivalent to calling -// stbtt_PackFontRanges(). If you more control over the packing of multiple -// fonts, or if you want to pack custom data into a font texture, take a look -// at the source to of stbtt_PackFontRanges() and create a custom version -// using these functions, e.g. call GatherRects multiple times, -// building up a single array of rects, then call PackRects once, -// then call RenderIntoRects repeatedly. This may result in a -// better packing than calling PackFontRanges multiple times -// (or it may not). - -// this is an opaque structure that you shouldn't mess with which holds -// all the context needed from PackBegin to PackEnd. -struct stbtt_pack_context { - void *user_allocator_context; - void *pack_info; - int width; - int height; - int stride_in_bytes; - int padding; - int skip_missing; - unsigned int h_oversample, v_oversample; - unsigned char *pixels; - void *nodes; -}; - -////////////////////////////////////////////////////////////////////////////// -// -// FONT LOADING -// -// - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); -// This function will determine the number of fonts in a font file. TrueType -// collection (.ttc) files may contain multiple fonts, while TrueType font -// (.ttf) files only contain one font. The number of fonts can be used for -// indexing with the previous function where the index is between zero and one -// less than the total fonts. If an error occurs, -1 is returned. - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); -// Each .ttf/.ttc file may have more than one font. Each font has a sequential -// index number starting from 0. Call this function to get the font offset for -// a given index; it returns -1 if the index is out of range. A regular .ttf -// file will only define one font and it always be at offset 0, so it will -// return '0' for index 0, and -1 for all other indices. - -// The following structure is defined publicly so you can declare one on -// the stack or as a global or etc, but you should treat it as opaque. -struct stbtt_fontinfo -{ - void * userdata; - unsigned char * data; // pointer to .ttf file - int fontstart; // offset of start of font - - int numGlyphs; // number of glyphs, needed for range checking - - int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf - int index_map; // a cmap mapping for our chosen character encoding - int indexToLocFormat; // format needed to map from glyph index to glyph - - stbtt__buf cff; // cff font data - stbtt__buf charstrings; // the charstring index - stbtt__buf gsubrs; // global charstring subroutines index - stbtt__buf subrs; // private charstring subroutines index - stbtt__buf fontdicts; // array of font dicts - stbtt__buf fdselect; // map from glyph to fontdict -}; - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); -// Given an offset into the file that defines a font, this function builds -// the necessary cached info for the rest of the system. You must allocate -// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't -// need to do anything special to free it, because the contents are pure -// value data with no additional data structures. Returns 0 on failure. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER TO GLYPH-INDEX CONVERSIOn - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); -// If you're going to perform multiple operations on the same character -// and you want a speed-up, call this function with the character you're -// going to process, then use glyph-based functions instead of the -// codepoint-based functions. -// Returns 0 if the character codepoint is not defined in the font. - - -////////////////////////////////////////////////////////////////////////////// -// -// CHARACTER PROPERTIES -// - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose "height" is 'pixels' tall. -// Height is measured as the distance from the highest ascender to the lowest -// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics -// and computing: -// scale = pixels / (ascent - descent) -// so if you prefer to measure height by the ascent only, use a similar calculation. - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); -// computes a scale factor to produce a font whose EM size is mapped to -// 'pixels' tall. This is probably what traditional APIs compute, but -// I'm not positive. - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); -// ascent is the coordinate above the baseline the font extends; descent -// is the coordinate below the baseline the font extends (i.e. it is typically negative) -// lineGap is the spacing between one row's descent and the next row's ascent... -// so you should advance the vertical position by "*ascent - *descent + *lineGap" -// these are expressed in unscaled coordinates, so you must multiply by -// the scale factor for a given size - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); -// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 -// table (specific to MS/Windows TTF files). -// -// Returns 1 on success (table present), 0 on failure. - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); -// the bounding box around all possible characters - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); -// leftSideBearing is the offset from the current horizontal position to the left edge of the character -// advanceWidth is the offset from the current horizontal position to the next horizontal position -// these are expressed in unscaled coordinates - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); -// an additional amount to add to the 'advance' value between ch1 and ch2 - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); -// Gets the bounding box of the visible part of the glyph, in unscaled coordinates - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); -// as above, but takes one or more glyph indices for greater efficiency - -typedef struct stbtt_kerningentry -{ - int glyph1; // use stbtt_FindGlyphIndex - int glyph2; - int advance; -} stbtt_kerningentry; - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); -// Retrieves a complete list of all of the kerning pairs provided by the font -// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. -// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) - -////////////////////////////////////////////////////////////////////////////// -// -// GLYPH SHAPES (you probably don't need these, but they have to go before -// the bitmaps for C declaration-order reasons) -// - -#ifndef STBTT_vmove // you can predefine these to use different values (but why?) - enum { - STBTT_vmove=1, - STBTT_vline, - STBTT_vcurve, - STBTT_vcubic - }; -#endif - -#ifndef stbtt_vertex // you can predefine this to use different values - // (we share this with other code at RAD) - #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file - typedef struct - { - stbtt_vertex_type x,y,cx,cy,cx1,cy1; - unsigned char type,padding; - } stbtt_vertex; -#endif - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); -// returns non-zero if nothing is drawn for this glyph - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); -// returns # of vertices and fills *vertices with the pointer to them -// these are expressed in "unscaled" coordinates -// -// The shape is a series of contours. Each one starts with -// a STBTT_moveto, then consists of a series of mixed -// STBTT_lineto and STBTT_curveto segments. A lineto -// draws a line from previous endpoint to its x,y; a curveto -// draws a quadratic bezier from previous endpoint to -// its x,y, using cx,cy as the bezier control point. - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); -// frees the data allocated above - -STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); -// fills svg with the character's SVG data. -// returns data size or 0 if SVG not found. - -////////////////////////////////////////////////////////////////////////////// -// -// BITMAP RENDERING -// - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); -// frees the bitmap allocated below - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// allocates a large-enough single-channel 8bpp bitmap and renders the -// specified character/glyph at the specified scale into it, with -// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). -// *width & *height are filled out with the width & height of the bitmap, -// which is stored left-to-right, top-to-bottom. -// -// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); -// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); -// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap -// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap -// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the -// width and height and positioning info for it first. - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); -// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel -// shift for the character - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); -// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering -// is performed (see stbtt_PackSetOversampling) - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -// get the bbox of the bitmap centered around the glyph origin; so the -// bitmap width is ix1-ix0, height is iy1-iy0, and location to place -// the bitmap top left is (leftSideBearing*scale,iy0). -// (Note that the bitmap uses y-increases-down, but the shape uses -// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); -// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel -// shift for the character - -// the following functions are equivalent to the above functions, but operate -// on glyph indices instead of Unicode codepoints (for efficiency) -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); - - -// @TODO: don't expose this structure -typedef struct -{ - int w,h,stride; - unsigned char *pixels; -} stbtt__bitmap; - -// rasterize a shape with quadratic beziers into a bitmap -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into - float flatness_in_pixels, // allowable error of curve in pixels - stbtt_vertex *vertices, // array of vertices defining shape - int num_verts, // number of vertices in above array - float scale_x, float scale_y, // scale applied to input vertices - float shift_x, float shift_y, // translation applied to input vertices - int x_off, int y_off, // another translation applied to input - int invert, // if non-zero, vertically flip shape - void *userdata); // context for to STBTT_MALLOC - -////////////////////////////////////////////////////////////////////////////// -// -// Signed Distance Function (or Field) rendering - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); -// frees the SDF bitmap allocated below - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); -// These functions compute a discretized SDF field for a single character, suitable for storing -// in a single-channel texture, sampling with bilinear filtering, and testing against -// larger than some threshold to produce scalable fonts. -// info -- the font -// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap -// glyph/codepoint -- the character to generate the SDF for -// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), -// which allows effects like bit outlines -// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) -// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) -// if positive, > onedge_value is inside; if negative, < onedge_value is inside -// width,height -- output height & width of the SDF bitmap (including padding) -// xoff,yoff -- output origin of the character -// return value -- a 2D array of bytes 0..255, width*height in size -// -// pixel_dist_scale & onedge_value are a scale & bias that allows you to make -// optimal use of the limited 0..255 for your application, trading off precision -// and special effects. SDF values outside the range 0..255 are clamped to 0..255. -// -// Example: -// scale = stbtt_ScaleForPixelHeight(22) -// padding = 5 -// onedge_value = 180 -// pixel_dist_scale = 180/5.0 = 36.0 -// -// This will create an SDF bitmap in which the character is about 22 pixels -// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled -// shape, sample the SDF at each pixel and fill the pixel if the SDF value -// is greater than or equal to 180/255. (You'll actually want to antialias, -// which is beyond the scope of this example.) Additionally, you can compute -// offset outlines (e.g. to stroke the character border inside & outside, -// or only outside). For example, to fill outside the character up to 3 SDF -// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above -// choice of variables maps a range from 5 pixels outside the shape to -// 2 pixels inside the shape to 0..255; this is intended primarily for apply -// outside effects only (the interior range is needed to allow proper -// antialiasing of the font at *smaller* sizes) -// -// The function computes the SDF analytically at each SDF pixel, not by e.g. -// building a higher-res bitmap and approximating it. In theory the quality -// should be as high as possible for an SDF of this size & representation, but -// unclear if this is true in practice (perhaps building a higher-res bitmap -// and computing from that can allow drop-out prevention). -// -// The algorithm has not been optimized at all, so expect it to be slow -// if computing lots of characters or very large sizes. - - - -////////////////////////////////////////////////////////////////////////////// -// -// Finding the right font... -// -// You should really just solve this offline, keep your own tables -// of what font is what, and don't try to get it out of the .ttf file. -// That's because getting it out of the .ttf file is really hard, because -// the names in the file can appear in many possible encodings, in many -// possible languages, and e.g. if you need a case-insensitive comparison, -// the details of that depend on the encoding & language in a complex way -// (actually underspecified in truetype, but also gigantic). -// -// But you can use the provided functions in two possible ways: -// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on -// unicode-encoded names to try to find the font you want; -// you can run this before calling stbtt_InitFont() -// -// stbtt_GetFontNameString() lets you get any of the various strings -// from the file yourself and do your own comparisons on them. -// You have to have called stbtt_InitFont() first. - - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); -// returns the offset (not index) of the font that matches, or -1 if none -// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". -// if you use any other flag, use a font name like "Arial"; this checks -// the 'macStyle' header field; i don't know if fonts set this consistently -#define STBTT_MACSTYLE_DONTCARE 0 -#define STBTT_MACSTYLE_BOLD 1 -#define STBTT_MACSTYLE_ITALIC 2 -#define STBTT_MACSTYLE_UNDERSCORE 4 -#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); -// returns 1/0 whether the first string interpreted as utf8 is identical to -// the second string interpreted as big-endian utf16... useful for strings from next func - -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); -// returns the string (which may be big-endian double byte, e.g. for unicode) -// and puts the length in bytes in *length. -// -// some of the values for the IDs are below; for more see the truetype spec: -// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html -// http://www.microsoft.com/typography/otspec/name.htm - -enum { // platformID - STBTT_PLATFORM_ID_UNICODE =0, - STBTT_PLATFORM_ID_MAC =1, - STBTT_PLATFORM_ID_ISO =2, - STBTT_PLATFORM_ID_MICROSOFT =3 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_UNICODE - STBTT_UNICODE_EID_UNICODE_1_0 =0, - STBTT_UNICODE_EID_UNICODE_1_1 =1, - STBTT_UNICODE_EID_ISO_10646 =2, - STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, - STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT - STBTT_MS_EID_SYMBOL =0, - STBTT_MS_EID_UNICODE_BMP =1, - STBTT_MS_EID_SHIFTJIS =2, - STBTT_MS_EID_UNICODE_FULL =10 -}; - -enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes - STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, - STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, - STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, - STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 -}; - -enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... - // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs - STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, - STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, - STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, - STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, - STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, - STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D -}; - -enum { // languageID for STBTT_PLATFORM_ID_MAC - STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, - STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, - STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, - STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , - STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , - STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, - STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 -}; - -#ifdef __cplusplus -} -#endif - -#endif // __STB_INCLUDE_STB_TRUETYPE_H__ - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -//// -//// IMPLEMENTATION -//// -//// - -#ifdef STB_TRUETYPE_IMPLEMENTATION - -#ifndef STBTT_MAX_OVERSAMPLE -#define STBTT_MAX_OVERSAMPLE 8 -#endif - -#if STBTT_MAX_OVERSAMPLE > 255 -#error "STBTT_MAX_OVERSAMPLE cannot be > 255" -#endif - -typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; - -#ifndef STBTT_RASTERIZER_VERSION -#define STBTT_RASTERIZER_VERSION 2 -#endif - -#ifdef _MSC_VER -#define STBTT__NOTUSED(v) (void)(v) -#else -#define STBTT__NOTUSED(v) (void)sizeof(v) -#endif - -////////////////////////////////////////////////////////////////////////// -// -// stbtt__buf helpers to parse data from file -// - -static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor++]; -} - -static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) -{ - if (b->cursor >= b->size) - return 0; - return b->data[b->cursor]; -} - -static void stbtt__buf_seek(stbtt__buf *b, int o) -{ - STBTT_assert(!(o > b->size || o < 0)); - b->cursor = (o > b->size || o < 0) ? b->size : o; -} - -static void stbtt__buf_skip(stbtt__buf *b, int o) -{ - stbtt__buf_seek(b, b->cursor + o); -} - -static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) -{ - stbtt_uint32 v = 0; - int i; - STBTT_assert(n >= 1 && n <= 4); - for (i = 0; i < n; i++) - v = (v << 8) | stbtt__buf_get8(b); - return v; -} - -static stbtt__buf stbtt__new_buf(const void *p, size_t size) -{ - stbtt__buf r; - STBTT_assert(size < 0x40000000); - r.data = (stbtt_uint8*) p; - r.size = (int) size; - r.cursor = 0; - return r; -} - -#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) -#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) - -static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) -{ - stbtt__buf r = stbtt__new_buf(NULL, 0); - if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; - r.data = b->data + o; - r.size = s; - return r; -} - -static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) -{ - int count, start, offsize; - start = b->cursor; - count = stbtt__buf_get16(b); - if (count) { - offsize = stbtt__buf_get8(b); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(b, offsize * count); - stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); - } - return stbtt__buf_range(b, start, b->cursor - start); -} - -static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) -{ - int b0 = stbtt__buf_get8(b); - if (b0 >= 32 && b0 <= 246) return b0 - 139; - else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; - else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; - else if (b0 == 28) return stbtt__buf_get16(b); - else if (b0 == 29) return stbtt__buf_get32(b); - STBTT_assert(0); - return 0; -} - -static void stbtt__cff_skip_operand(stbtt__buf *b) { - int v, b0 = stbtt__buf_peek8(b); - STBTT_assert(b0 >= 28); - if (b0 == 30) { - stbtt__buf_skip(b, 1); - while (b->cursor < b->size) { - v = stbtt__buf_get8(b); - if ((v & 0xF) == 0xF || (v >> 4) == 0xF) - break; - } - } else { - stbtt__cff_int(b); - } -} - -static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) -{ - stbtt__buf_seek(b, 0); - while (b->cursor < b->size) { - int start = b->cursor, end, op; - while (stbtt__buf_peek8(b) >= 28) - stbtt__cff_skip_operand(b); - end = b->cursor; - op = stbtt__buf_get8(b); - if (op == 12) op = stbtt__buf_get8(b) | 0x100; - if (op == key) return stbtt__buf_range(b, start, end-start); - } - return stbtt__buf_range(b, 0, 0); -} - -static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) -{ - int i; - stbtt__buf operands = stbtt__dict_get(b, key); - for (i = 0; i < outcount && operands.cursor < operands.size; i++) - out[i] = stbtt__cff_int(&operands); -} - -static int stbtt__cff_index_count(stbtt__buf *b) -{ - stbtt__buf_seek(b, 0); - return stbtt__buf_get16(b); -} - -static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) -{ - int count, offsize, start, end; - stbtt__buf_seek(&b, 0); - count = stbtt__buf_get16(&b); - offsize = stbtt__buf_get8(&b); - STBTT_assert(i >= 0 && i < count); - STBTT_assert(offsize >= 1 && offsize <= 4); - stbtt__buf_skip(&b, i*offsize); - start = stbtt__buf_get(&b, offsize); - end = stbtt__buf_get(&b, offsize); - return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); -} - -////////////////////////////////////////////////////////////////////////// -// -// accessors to parse data from file -// - -// on platforms that don't allow misaligned reads, if we want to allow -// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE - -#define ttBYTE(p) (* (stbtt_uint8 *) (p)) -#define ttCHAR(p) (* (stbtt_int8 *) (p)) -#define ttFixed(p) ttLONG(p) - -static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } -static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } -static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } - -#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) -#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) - -static int stbtt__isfont(stbtt_uint8 *font) -{ - // check the version number - if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 - if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! - if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF - if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 - if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts - return 0; -} - -// @OPTIMIZE: binary search -static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) -{ - stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); - stbtt_uint32 tabledir = fontstart + 12; - stbtt_int32 i; - for (i=0; i < num_tables; ++i) { - stbtt_uint32 loc = tabledir + 16*i; - if (stbtt_tag(data+loc+0, tag)) - return ttULONG(data+loc+8); - } - return 0; -} - -static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) -{ - // if it's just a font, there's only one valid index - if (stbtt__isfont(font_collection)) - return index == 0 ? 0 : -1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - stbtt_int32 n = ttLONG(font_collection+8); - if (index >= n) - return -1; - return ttULONG(font_collection+12+index*4); - } - } - return -1; -} - -static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) -{ - // if it's just a font, there's only one valid font - if (stbtt__isfont(font_collection)) - return 1; - - // check if it's a TTC - if (stbtt_tag(font_collection, "ttcf")) { - // version 1? - if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { - return ttLONG(font_collection+8); - } - } - return 0; -} - -static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) -{ - stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; - stbtt__buf pdict; - stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); - if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); - pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); - stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); - if (!subrsoff) return stbtt__new_buf(NULL, 0); - stbtt__buf_seek(&cff, private_loc[1]+subrsoff); - return stbtt__cff_get_index(&cff); -} - -// since most people won't use this, find this table the first time it's needed -static int stbtt__get_svg(stbtt_fontinfo *info) -{ - stbtt_uint32 t; - if (info->svg < 0) { - t = stbtt__find_table(info->data, info->fontstart, "SVG "); - if (t) { - stbtt_uint32 offset = ttULONG(info->data + t + 2); - info->svg = t + offset; - } else { - info->svg = 0; - } - } - return info->svg; -} - -static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) -{ - stbtt_uint32 cmap, t; - stbtt_int32 i,numTables; - - info->data = data; - info->fontstart = fontstart; - info->cff = stbtt__new_buf(NULL, 0); - - cmap = stbtt__find_table(data, fontstart, "cmap"); // required - info->loca = stbtt__find_table(data, fontstart, "loca"); // required - info->head = stbtt__find_table(data, fontstart, "head"); // required - info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required - info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required - info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required - info->kern = stbtt__find_table(data, fontstart, "kern"); // not required - info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required - - if (!cmap || !info->head || !info->hhea || !info->hmtx) - return 0; - if (info->glyf) { - // required for truetype - if (!info->loca) return 0; - } else { - // initialization for CFF / Type2 fonts (OTF) - stbtt__buf b, topdict, topdictidx; - stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; - stbtt_uint32 cff; - - cff = stbtt__find_table(data, fontstart, "CFF "); - if (!cff) return 0; - - info->fontdicts = stbtt__new_buf(NULL, 0); - info->fdselect = stbtt__new_buf(NULL, 0); - - // @TODO this should use size from table (not 512MB) - info->cff = stbtt__new_buf(data+cff, 512*1024*1024); - b = info->cff; - - // read the header - stbtt__buf_skip(&b, 2); - stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize - - // @TODO the name INDEX could list multiple fonts, - // but we just use the first one. - stbtt__cff_get_index(&b); // name INDEX - topdictidx = stbtt__cff_get_index(&b); - topdict = stbtt__cff_index_get(topdictidx, 0); - stbtt__cff_get_index(&b); // string INDEX - info->gsubrs = stbtt__cff_get_index(&b); - - stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); - stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); - stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); - stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); - info->subrs = stbtt__get_subrs(b, topdict); - - // we only support Type 2 charstrings - if (cstype != 2) return 0; - if (charstrings == 0) return 0; - - if (fdarrayoff) { - // looks like a CID font - if (!fdselectoff) return 0; - stbtt__buf_seek(&b, fdarrayoff); - info->fontdicts = stbtt__cff_get_index(&b); - info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); - } - - stbtt__buf_seek(&b, charstrings); - info->charstrings = stbtt__cff_get_index(&b); - } - - t = stbtt__find_table(data, fontstart, "maxp"); - if (t) - info->numGlyphs = ttUSHORT(data+t+4); - else - info->numGlyphs = 0xffff; - - info->svg = -1; - - // find a cmap encoding table we understand *now* to avoid searching - // later. (todo: could make this installable) - // the same regardless of glyph. - numTables = ttUSHORT(data + cmap + 2); - info->index_map = 0; - for (i=0; i < numTables; ++i) { - stbtt_uint32 encoding_record = cmap + 4 + 8 * i; - // find an encoding we understand: - switch(ttUSHORT(data+encoding_record)) { - case STBTT_PLATFORM_ID_MICROSOFT: - switch (ttUSHORT(data+encoding_record+2)) { - case STBTT_MS_EID_UNICODE_BMP: - case STBTT_MS_EID_UNICODE_FULL: - // MS/Unicode - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - break; - case STBTT_PLATFORM_ID_UNICODE: - // Mac/iOS has these - // all the encodingIDs are unicode, so we don't bother to check it - info->index_map = cmap + ttULONG(data+encoding_record+4); - break; - } - } - if (info->index_map == 0) - return 0; - - info->indexToLocFormat = ttUSHORT(data+info->head + 50); - return 1; -} - -STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) -{ - stbtt_uint8 *data = info->data; - stbtt_uint32 index_map = info->index_map; - - stbtt_uint16 format = ttUSHORT(data + index_map + 0); - if (format == 0) { // apple byte encoding - stbtt_int32 bytes = ttUSHORT(data + index_map + 2); - if (unicode_codepoint < bytes-6) - return ttBYTE(data + index_map + 6 + unicode_codepoint); - return 0; - } else if (format == 6) { - stbtt_uint32 first = ttUSHORT(data + index_map + 6); - stbtt_uint32 count = ttUSHORT(data + index_map + 8); - if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) - return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); - return 0; - } else if (format == 2) { - STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean - return 0; - } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges - stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; - stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; - stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); - stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; - - // do a binary search of the segments - stbtt_uint32 endCount = index_map + 14; - stbtt_uint32 search = endCount; - - if (unicode_codepoint > 0xffff) - return 0; - - // they lie from endCount .. endCount + segCount - // but searchRange is the nearest power of two, so... - if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) - search += rangeShift*2; - - // now decrement to bias correctly to find smallest - search -= 2; - while (entrySelector) { - stbtt_uint16 end; - searchRange >>= 1; - end = ttUSHORT(data + search + searchRange*2); - if (unicode_codepoint > end) - search += searchRange*2; - --entrySelector; - } - search += 2; - - { - stbtt_uint16 offset, start, last; - stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); - - start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); - last = ttUSHORT(data + endCount + 2*item); - if (unicode_codepoint < start || unicode_codepoint > last) - return 0; - - offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); - if (offset == 0) - return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); - - return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); - } - } else if (format == 12 || format == 13) { - stbtt_uint32 ngroups = ttULONG(data+index_map+12); - stbtt_int32 low,high; - low = 0; high = (stbtt_int32)ngroups; - // Binary search the right group. - while (low < high) { - stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high - stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); - stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); - if ((stbtt_uint32) unicode_codepoint < start_char) - high = mid; - else if ((stbtt_uint32) unicode_codepoint > end_char) - low = mid+1; - else { - stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); - if (format == 12) - return start_glyph + unicode_codepoint-start_char; - else // format == 13 - return start_glyph; - } - } - return 0; // not found - } - // @TODO - STBTT_assert(0); - return 0; -} - -STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) -{ - return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); -} - -static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) -{ - v->type = type; - v->x = (stbtt_int16) x; - v->y = (stbtt_int16) y; - v->cx = (stbtt_int16) cx; - v->cy = (stbtt_int16) cy; -} - -static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) -{ - int g1,g2; - - STBTT_assert(!info->cff.size); - - if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range - if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format - - if (info->indexToLocFormat == 0) { - g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; - g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; - } else { - g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); - g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); - } - - return g1==g2 ? -1 : g1; // if length is 0, return -1 -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); - -STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - if (info->cff.size) { - stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); - } else { - int g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 0; - - if (x0) *x0 = ttSHORT(info->data + g + 2); - if (y0) *y0 = ttSHORT(info->data + g + 4); - if (x1) *x1 = ttSHORT(info->data + g + 6); - if (y1) *y1 = ttSHORT(info->data + g + 8); - } - return 1; -} - -STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) -{ - return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); -} - -STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt_int16 numberOfContours; - int g; - if (info->cff.size) - return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; - g = stbtt__GetGlyfOffset(info, glyph_index); - if (g < 0) return 1; - numberOfContours = ttSHORT(info->data + g); - return numberOfContours == 0; -} - -static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, - stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) -{ - if (start_off) { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); - } - return num_vertices; -} - -static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - stbtt_int16 numberOfContours; - stbtt_uint8 *endPtsOfContours; - stbtt_uint8 *data = info->data; - stbtt_vertex *vertices=0; - int num_vertices=0; - int g = stbtt__GetGlyfOffset(info, glyph_index); - - *pvertices = NULL; - - if (g < 0) return 0; - - numberOfContours = ttSHORT(data + g); - - if (numberOfContours > 0) { - stbtt_uint8 flags=0,flagcount; - stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; - stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; - stbtt_uint8 *points; - endPtsOfContours = (data + g + 10); - ins = ttUSHORT(data + g + 10 + numberOfContours * 2); - points = data + g + 10 + numberOfContours * 2 + 2 + ins; - - n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); - - m = n + 2*numberOfContours; // a loose bound on how many vertices we might need - vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); - if (vertices == 0) - return 0; - - next_move = 0; - flagcount=0; - - // in first pass, we load uninterpreted data into the allocated array - // above, shifted to the end of the array so we won't overwrite it when - // we create our final data starting from the front - - off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated - - // first load flags - - for (i=0; i < n; ++i) { - if (flagcount == 0) { - flags = *points++; - if (flags & 8) - flagcount = *points++; - } else - --flagcount; - vertices[off+i].type = flags; - } - - // now load x coordinates - x=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 2) { - stbtt_int16 dx = *points++; - x += (flags & 16) ? dx : -dx; // ??? - } else { - if (!(flags & 16)) { - x = x + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].x = (stbtt_int16) x; - } - - // now load y coordinates - y=0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - if (flags & 4) { - stbtt_int16 dy = *points++; - y += (flags & 32) ? dy : -dy; // ??? - } else { - if (!(flags & 32)) { - y = y + (stbtt_int16) (points[0]*256 + points[1]); - points += 2; - } - } - vertices[off+i].y = (stbtt_int16) y; - } - - // now convert them to our format - num_vertices=0; - sx = sy = cx = cy = scx = scy = 0; - for (i=0; i < n; ++i) { - flags = vertices[off+i].type; - x = (stbtt_int16) vertices[off+i].x; - y = (stbtt_int16) vertices[off+i].y; - - if (next_move == i) { - if (i != 0) - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - - // now start the new one - start_off = !(flags & 1); - if (start_off) { - // if we start off with an off-curve point, then when we need to find a point on the curve - // where we can start, and we need to save some state for when we wraparound. - scx = x; - scy = y; - if (!(vertices[off+i+1].type & 1)) { - // next point is also a curve point, so interpolate an on-point curve - sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; - sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; - } else { - // otherwise just use the next point as our start point - sx = (stbtt_int32) vertices[off+i+1].x; - sy = (stbtt_int32) vertices[off+i+1].y; - ++i; // we're using point i+1 as the starting point, so skip it - } - } else { - sx = x; - sy = y; - } - stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); - was_off = 0; - next_move = 1 + ttUSHORT(endPtsOfContours+j*2); - ++j; - } else { - if (!(flags & 1)) { // if it's a curve - if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); - cx = x; - cy = y; - was_off = 1; - } else { - if (was_off) - stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); - else - stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); - was_off = 0; - } - } - } - num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); - } else if (numberOfContours < 0) { - // Compound shapes. - int more = 1; - stbtt_uint8 *comp = data + g + 10; - num_vertices = 0; - vertices = 0; - while (more) { - stbtt_uint16 flags, gidx; - int comp_num_verts = 0, i; - stbtt_vertex *comp_verts = 0, *tmp = 0; - float mtx[6] = {1,0,0,1,0,0}, m, n; - - flags = ttSHORT(comp); comp+=2; - gidx = ttSHORT(comp); comp+=2; - - if (flags & 2) { // XY values - if (flags & 1) { // shorts - mtx[4] = ttSHORT(comp); comp+=2; - mtx[5] = ttSHORT(comp); comp+=2; - } else { - mtx[4] = ttCHAR(comp); comp+=1; - mtx[5] = ttCHAR(comp); comp+=1; - } - } - else { - // @TODO handle matching point - STBTT_assert(0); - } - if (flags & (1<<3)) { // WE_HAVE_A_SCALE - mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = mtx[2] = 0; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO - mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; - mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; - } - - // Find transformation scales. - m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); - n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); - - // Get indexed glyph. - comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); - if (comp_num_verts > 0) { - // Transform vertices. - for (i = 0; i < comp_num_verts; ++i) { - stbtt_vertex* v = &comp_verts[i]; - stbtt_vertex_type x,y; - x=v->x; y=v->y; - v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - x=v->cx; y=v->cy; - v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); - v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); - } - // Append vertices. - tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); - if (!tmp) { - if (vertices) STBTT_free(vertices, info->userdata); - if (comp_verts) STBTT_free(comp_verts, info->userdata); - return 0; - } - if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); - STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); - if (vertices) STBTT_free(vertices, info->userdata); - vertices = tmp; - STBTT_free(comp_verts, info->userdata); - num_vertices += comp_num_verts; - } - // More components ? - more = flags & (1<<5); - } - } else { - // numberOfCounters == 0, do nothing - } - - *pvertices = vertices; - return num_vertices; -} - -typedef struct -{ - int bounds; - int started; - float first_x, first_y; - float x, y; - stbtt_int32 min_x, max_x, min_y, max_y; - - stbtt_vertex *pvertices; - int num_vertices; -} stbtt__csctx; - -#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} - -static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) -{ - if (x > c->max_x || !c->started) c->max_x = x; - if (y > c->max_y || !c->started) c->max_y = y; - if (x < c->min_x || !c->started) c->min_x = x; - if (y < c->min_y || !c->started) c->min_y = y; - c->started = 1; -} - -static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) -{ - if (c->bounds) { - stbtt__track_vertex(c, x, y); - if (type == STBTT_vcubic) { - stbtt__track_vertex(c, cx, cy); - stbtt__track_vertex(c, cx1, cy1); - } - } else { - stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); - c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; - c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; - } - c->num_vertices++; -} - -static void stbtt__csctx_close_shape(stbtt__csctx *ctx) -{ - if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) -{ - stbtt__csctx_close_shape(ctx); - ctx->first_x = ctx->x = ctx->x + dx; - ctx->first_y = ctx->y = ctx->y + dy; - stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) -{ - ctx->x += dx; - ctx->y += dy; - stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); -} - -static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) -{ - float cx1 = ctx->x + dx1; - float cy1 = ctx->y + dy1; - float cx2 = cx1 + dx2; - float cy2 = cy1 + dy2; - ctx->x = cx2 + dx3; - ctx->y = cy2 + dy3; - stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); -} - -static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) -{ - int count = stbtt__cff_index_count(&idx); - int bias = 107; - if (count >= 33900) - bias = 32768; - else if (count >= 1240) - bias = 1131; - n += bias; - if (n < 0 || n >= count) - return stbtt__new_buf(NULL, 0); - return stbtt__cff_index_get(idx, n); -} - -static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) -{ - stbtt__buf fdselect = info->fdselect; - int nranges, start, end, v, fmt, fdselector = -1, i; - - stbtt__buf_seek(&fdselect, 0); - fmt = stbtt__buf_get8(&fdselect); - if (fmt == 0) { - // untested - stbtt__buf_skip(&fdselect, glyph_index); - fdselector = stbtt__buf_get8(&fdselect); - } else if (fmt == 3) { - nranges = stbtt__buf_get16(&fdselect); - start = stbtt__buf_get16(&fdselect); - for (i = 0; i < nranges; i++) { - v = stbtt__buf_get8(&fdselect); - end = stbtt__buf_get16(&fdselect); - if (glyph_index >= start && glyph_index < end) { - fdselector = v; - break; - } - start = end; - } - } - if (fdselector == -1) stbtt__new_buf(NULL, 0); - return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); -} - -static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) -{ - int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; - int has_subrs = 0, clear_stack; - float s[48]; - stbtt__buf subr_stack[10], subrs = info->subrs, b; - float f; - -#define STBTT__CSERR(s) (0) - - // this currently ignores the initial width value, which isn't needed if we have hmtx - b = stbtt__cff_index_get(info->charstrings, glyph_index); - while (b.cursor < b.size) { - i = 0; - clear_stack = 1; - b0 = stbtt__buf_get8(&b); - switch (b0) { - // @TODO implement hinting - case 0x13: // hintmask - case 0x14: // cntrmask - if (in_header) - maskbits += (sp / 2); // implicit "vstem" - in_header = 0; - stbtt__buf_skip(&b, (maskbits + 7) / 8); - break; - - case 0x01: // hstem - case 0x03: // vstem - case 0x12: // hstemhm - case 0x17: // vstemhm - maskbits += (sp / 2); - break; - - case 0x15: // rmoveto - in_header = 0; - if (sp < 2) return STBTT__CSERR("rmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); - break; - case 0x04: // vmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("vmoveto stack"); - stbtt__csctx_rmove_to(c, 0, s[sp-1]); - break; - case 0x16: // hmoveto - in_header = 0; - if (sp < 1) return STBTT__CSERR("hmoveto stack"); - stbtt__csctx_rmove_to(c, s[sp-1], 0); - break; - - case 0x05: // rlineto - if (sp < 2) return STBTT__CSERR("rlineto stack"); - for (; i + 1 < sp; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical - // starting from a different place. - - case 0x07: // vlineto - if (sp < 1) return STBTT__CSERR("vlineto stack"); - goto vlineto; - case 0x06: // hlineto - if (sp < 1) return STBTT__CSERR("hlineto stack"); - for (;;) { - if (i >= sp) break; - stbtt__csctx_rline_to(c, s[i], 0); - i++; - vlineto: - if (i >= sp) break; - stbtt__csctx_rline_to(c, 0, s[i]); - i++; - } - break; - - case 0x1F: // hvcurveto - if (sp < 4) return STBTT__CSERR("hvcurveto stack"); - goto hvcurveto; - case 0x1E: // vhcurveto - if (sp < 4) return STBTT__CSERR("vhcurveto stack"); - for (;;) { - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); - i += 4; - hvcurveto: - if (i + 3 >= sp) break; - stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); - i += 4; - } - break; - - case 0x08: // rrcurveto - if (sp < 6) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x18: // rcurveline - if (sp < 8) return STBTT__CSERR("rcurveline stack"); - for (; i + 5 < sp - 2; i += 6) - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); - stbtt__csctx_rline_to(c, s[i], s[i+1]); - break; - - case 0x19: // rlinecurve - if (sp < 8) return STBTT__CSERR("rlinecurve stack"); - for (; i + 1 < sp - 6; i += 2) - stbtt__csctx_rline_to(c, s[i], s[i+1]); - if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); - stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); - break; - - case 0x1A: // vvcurveto - case 0x1B: // hhcurveto - if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); - f = 0.0; - if (sp & 1) { f = s[i]; i++; } - for (; i + 3 < sp; i += 4) { - if (b0 == 0x1B) - stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); - else - stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); - f = 0.0; - } - break; - - case 0x0A: // callsubr - if (!has_subrs) { - if (info->fdselect.size) - subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); - has_subrs = 1; - } - // FALLTHROUGH - case 0x1D: // callgsubr - if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); - v = (int) s[--sp]; - if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); - subr_stack[subr_stack_height++] = b; - b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); - if (b.size == 0) return STBTT__CSERR("subr not found"); - b.cursor = 0; - clear_stack = 0; - break; - - case 0x0B: // return - if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); - b = subr_stack[--subr_stack_height]; - clear_stack = 0; - break; - - case 0x0E: // endchar - stbtt__csctx_close_shape(c); - return 1; - - case 0x0C: { // two-byte escape - float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; - float dx, dy; - int b1 = stbtt__buf_get8(&b); - switch (b1) { - // @TODO These "flex" implementations ignore the flex-depth and resolution, - // and always draw beziers. - case 0x22: // hflex - if (sp < 7) return STBTT__CSERR("hflex stack"); - dx1 = s[0]; - dx2 = s[1]; - dy2 = s[2]; - dx3 = s[3]; - dx4 = s[4]; - dx5 = s[5]; - dx6 = s[6]; - stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); - break; - - case 0x23: // flex - if (sp < 13) return STBTT__CSERR("flex stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = s[10]; - dy6 = s[11]; - //fd is s[12] - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - case 0x24: // hflex1 - if (sp < 9) return STBTT__CSERR("hflex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dx4 = s[5]; - dx5 = s[6]; - dy5 = s[7]; - dx6 = s[8]; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); - stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); - break; - - case 0x25: // flex1 - if (sp < 11) return STBTT__CSERR("flex1 stack"); - dx1 = s[0]; - dy1 = s[1]; - dx2 = s[2]; - dy2 = s[3]; - dx3 = s[4]; - dy3 = s[5]; - dx4 = s[6]; - dy4 = s[7]; - dx5 = s[8]; - dy5 = s[9]; - dx6 = dy6 = s[10]; - dx = dx1+dx2+dx3+dx4+dx5; - dy = dy1+dy2+dy3+dy4+dy5; - if (STBTT_fabs(dx) > STBTT_fabs(dy)) - dy6 = -dy; - else - dx6 = -dx; - stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); - stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); - break; - - default: - return STBTT__CSERR("unimplemented"); - } - } break; - - default: - if (b0 != 255 && b0 != 28 && b0 < 32) - return STBTT__CSERR("reserved operator"); - - // push immediate - if (b0 == 255) { - f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; - } else { - stbtt__buf_skip(&b, -1); - f = (float)(stbtt_int16)stbtt__cff_int(&b); - } - if (sp >= 48) return STBTT__CSERR("push stack overflow"); - s[sp++] = f; - clear_stack = 0; - break; - } - if (clear_stack) sp = 0; - } - return STBTT__CSERR("no endchar"); - -#undef STBTT__CSERR -} - -static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - // runs the charstring twice, once to count and once to output (to avoid realloc) - stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); - stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); - if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { - *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); - output_ctx.pvertices = *pvertices; - if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { - STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); - return output_ctx.num_vertices; - } - } - *pvertices = NULL; - return 0; -} - -static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) -{ - stbtt__csctx c = STBTT__CSCTX_INIT(1); - int r = stbtt__run_charstring(info, glyph_index, &c); - if (x0) *x0 = r ? c.min_x : 0; - if (y0) *y0 = r ? c.min_y : 0; - if (x1) *x1 = r ? c.max_x : 0; - if (y1) *y1 = r ? c.max_y : 0; - return r ? c.num_vertices : 0; -} - -STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) -{ - if (!info->cff.size) - return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); - else - return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); -} - -STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) -{ - stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); - if (glyph_index < numOfLongHorMetrics) { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); - } else { - if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); - if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); - } -} - -STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) -{ - stbtt_uint8 *data = info->data + info->kern; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - return ttUSHORT(data+10); -} - -STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) -{ - stbtt_uint8 *data = info->data + info->kern; - int k, length; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - length = ttUSHORT(data+10); - if (table_length < length) - length = table_length; - - for (k = 0; k < length; k++) - { - table[k].glyph1 = ttUSHORT(data+18+(k*6)); - table[k].glyph2 = ttUSHORT(data+20+(k*6)); - table[k].advance = ttSHORT(data+22+(k*6)); - } - - return length; -} - -static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint8 *data = info->data + info->kern; - stbtt_uint32 needle, straw; - int l, r, m; - - // we only look at the first table. it must be 'horizontal' and format 0. - if (!info->kern) - return 0; - if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 - return 0; - if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format - return 0; - - l = 0; - r = ttUSHORT(data+10) - 1; - needle = glyph1 << 16 | glyph2; - while (l <= r) { - m = (l + r) >> 1; - straw = ttULONG(data+18+(m*6)); // note: unaligned read - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else - return ttSHORT(data+22+(m*6)); - } - return 0; -} - -static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) -{ - stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); - switch (coverageFormat) { - case 1: { - stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); - - // Binary search. - stbtt_int32 l=0, r=glyphCount-1, m; - int straw, needle=glyph; - while (l <= r) { - stbtt_uint8 *glyphArray = coverageTable + 4; - stbtt_uint16 glyphID; - m = (l + r) >> 1; - glyphID = ttUSHORT(glyphArray + 2 * m); - straw = glyphID; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - return m; - } - } - break; - } - - case 2: { - stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); - stbtt_uint8 *rangeArray = coverageTable + 4; - - // Binary search. - stbtt_int32 l=0, r=rangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *rangeRecord; - m = (l + r) >> 1; - rangeRecord = rangeArray + 6 * m; - strawStart = ttUSHORT(rangeRecord); - strawEnd = ttUSHORT(rangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else { - stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); - return startCoverageIndex + glyph - strawStart; - } - } - break; - } - - default: return -1; // unsupported - } - - return -1; -} - -static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) -{ - stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); - switch (classDefFormat) - { - case 1: { - stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); - stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); - stbtt_uint8 *classDef1ValueArray = classDefTable + 6; - - if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) - return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); - break; - } - - case 2: { - stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); - stbtt_uint8 *classRangeRecords = classDefTable + 4; - - // Binary search. - stbtt_int32 l=0, r=classRangeCount-1, m; - int strawStart, strawEnd, needle=glyph; - while (l <= r) { - stbtt_uint8 *classRangeRecord; - m = (l + r) >> 1; - classRangeRecord = classRangeRecords + 6 * m; - strawStart = ttUSHORT(classRangeRecord); - strawEnd = ttUSHORT(classRangeRecord + 2); - if (needle < strawStart) - r = m - 1; - else if (needle > strawEnd) - l = m + 1; - else - return (stbtt_int32)ttUSHORT(classRangeRecord + 4); - } - break; - } - - default: - return -1; // Unsupported definition type, return an error. - } - - // "All glyphs not assigned to a class fall into class 0". (OpenType spec) - return 0; -} - -// Define to STBTT_assert(x) if you want to break on unimplemented formats. -#define STBTT_GPOS_TODO_assert(x) - -static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) -{ - stbtt_uint16 lookupListOffset; - stbtt_uint8 *lookupList; - stbtt_uint16 lookupCount; - stbtt_uint8 *data; - stbtt_int32 i, sti; - - if (!info->gpos) return 0; - - data = info->data + info->gpos; - - if (ttUSHORT(data+0) != 1) return 0; // Major version 1 - if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 - - lookupListOffset = ttUSHORT(data+8); - lookupList = data + lookupListOffset; - lookupCount = ttUSHORT(lookupList); - - for (i=0; i= pairSetCount) return 0; - - needle=glyph2; - r=pairValueCount-1; - l=0; - - // Binary search. - while (l <= r) { - stbtt_uint16 secondGlyph; - stbtt_uint8 *pairValue; - m = (l + r) >> 1; - pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; - secondGlyph = ttUSHORT(pairValue); - straw = secondGlyph; - if (needle < straw) - r = m - 1; - else if (needle > straw) - l = m + 1; - else { - stbtt_int16 xAdvance = ttSHORT(pairValue + 2); - return xAdvance; - } - } - } else - return 0; - break; - } - - case 2: { - stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); - stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); - if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? - stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); - stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); - int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); - int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); - - stbtt_uint16 class1Count = ttUSHORT(table + 12); - stbtt_uint16 class2Count = ttUSHORT(table + 14); - stbtt_uint8 *class1Records, *class2Records; - stbtt_int16 xAdvance; - - if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed - if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed - - class1Records = table + 16; - class2Records = class1Records + 2 * (glyph1class * class2Count); - xAdvance = ttSHORT(class2Records + 2 * glyph2class); - return xAdvance; - } else - return 0; - break; - } - - default: - return 0; // Unsupported position format - } - } - } - - return 0; -} - -STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) -{ - int xAdvance = 0; - - if (info->gpos) - xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); - else if (info->kern) - xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); - - return xAdvance; -} - -STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) -{ - if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs - return 0; - return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); -} - -STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) -{ - stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); -} - -STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) -{ - if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); - if (descent) *descent = ttSHORT(info->data+info->hhea + 6); - if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); -} - -STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) -{ - int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); - if (!tab) - return 0; - if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); - if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); - if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); - return 1; -} - -STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) -{ - *x0 = ttSHORT(info->data + info->head + 36); - *y0 = ttSHORT(info->data + info->head + 38); - *x1 = ttSHORT(info->data + info->head + 40); - *y1 = ttSHORT(info->data + info->head + 42); -} - -STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) -{ - int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); - return (float) height / fheight; -} - -STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) -{ - int unitsPerEm = ttUSHORT(info->data + info->head + 18); - return pixels / unitsPerEm; -} - -STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) -{ - STBTT_free(v, info->userdata); -} - -STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) -{ - int i; - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); - - int numEntries = ttUSHORT(svg_doc_list); - stbtt_uint8 *svg_docs = svg_doc_list + 2; - - for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) - return svg_doc; - } - return 0; -} - -STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) -{ - stbtt_uint8 *data = info->data; - stbtt_uint8 *svg_doc; - - if (info->svg == 0) - return 0; - - svg_doc = stbtt_FindSVGDoc(info, gl); - if (svg_doc != NULL) { - *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); - return ttULONG(svg_doc + 8); - } else { - return 0; - } -} - -STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) -{ - return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); -} - -////////////////////////////////////////////////////////////////////////////// -// -// antialiasing software rasterizer -// - -STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning - if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { - // e.g. space character - if (ix0) *ix0 = 0; - if (iy0) *iy0 = 0; - if (ix1) *ix1 = 0; - if (iy1) *iy1 = 0; - } else { - // move to integral bboxes (treating pixels as little squares, what pixels get touched)? - if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); - if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); - if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); - if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); - } -} - -STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); -} - -STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) -{ - stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); -} - -////////////////////////////////////////////////////////////////////////////// -// -// Rasterizer - -typedef struct stbtt__hheap_chunk -{ - struct stbtt__hheap_chunk *next; -} stbtt__hheap_chunk; - -typedef struct stbtt__hheap -{ - struct stbtt__hheap_chunk *head; - void *first_free; - int num_remaining_in_head_chunk; -} stbtt__hheap; - -static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) -{ - if (hh->first_free) { - void *p = hh->first_free; - hh->first_free = * (void **) p; - return p; - } else { - if (hh->num_remaining_in_head_chunk == 0) { - int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); - stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); - if (c == NULL) - return NULL; - c->next = hh->head; - hh->head = c; - hh->num_remaining_in_head_chunk = count; - } - --hh->num_remaining_in_head_chunk; - return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; - } -} - -static void stbtt__hheap_free(stbtt__hheap *hh, void *p) -{ - *(void **) p = hh->first_free; - hh->first_free = p; -} - -static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) -{ - stbtt__hheap_chunk *c = hh->head; - while (c) { - stbtt__hheap_chunk *n = c->next; - STBTT_free(c, userdata); - c = n; - } -} - -typedef struct stbtt__edge { - float x0,y0, x1,y1; - int invert; -} stbtt__edge; - - -typedef struct stbtt__active_edge -{ - struct stbtt__active_edge *next; - #if STBTT_RASTERIZER_VERSION==1 - int x,dx; - float ey; - int direction; - #elif STBTT_RASTERIZER_VERSION==2 - float fx,fdx,fdy; - float direction; - float sy; - float ey; - #else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" - #endif -} stbtt__active_edge; - -#if STBTT_RASTERIZER_VERSION == 1 -#define STBTT_FIXSHIFT 10 -#define STBTT_FIX (1 << STBTT_FIXSHIFT) -#define STBTT_FIXMASK (STBTT_FIX-1) - -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - if (!z) return z; - - // round dx down to avoid overshooting - if (dxdy < 0) - z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); - else - z->dx = STBTT_ifloor(STBTT_FIX * dxdy); - - z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount - z->x -= off_x * STBTT_FIX; - - z->ey = e->y1; - z->next = 0; - z->direction = e->invert ? 1 : -1; - return z; -} -#elif STBTT_RASTERIZER_VERSION == 2 -static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) -{ - stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); - STBTT_assert(z != NULL); - //STBTT_assert(e->y0 <= start_point); - if (!z) return z; - z->fdx = dxdy; - z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; - z->fx = e->x0 + dxdy * (start_point - e->y0); - z->fx -= off_x; - z->direction = e->invert ? 1.0f : -1.0f; - z->sy = e->y0; - z->ey = e->y1; - z->next = 0; - return z; -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#if STBTT_RASTERIZER_VERSION == 1 -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) -{ - // non-zero winding fill - int x0=0, w=0; - - while (e) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->direction; - } else { - int x1 = e->x; w += e->direction; - // if we went to zero, we need to draw - if (w == 0) { - int i = x0 >> STBTT_FIXSHIFT; - int j = x1 >> STBTT_FIXSHIFT; - - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = scanline[i] + (stbtt_uint8) max_weight; - } - } - } - } - - e = e->next; - } -} - -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0; - int max_weight = (255 / vsubsample); // weight per vertical scanline - int s; // vertical subsample index - unsigned char scanline_data[512], *scanline; - - if (result->w > 512) - scanline = (unsigned char *) STBTT_malloc(result->w, userdata); - else - scanline = scanline_data; - - y = off_y * vsubsample; - e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; - - while (j < result->h) { - STBTT_memset(scanline, 0, result->w); - for (s=0; s < vsubsample; ++s) { - // find center of pixel for this scanline - float scan_y = y + 0.5f; - stbtt__active_edge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for(;;) { - int changed=0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - stbtt__active_edge *t = *step; - stbtt__active_edge *q = t->next; - - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e->y0 <= scan_y) { - if (e->y1 > scan_y) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); - if (z != NULL) { - // find insertion point - if (active == NULL) - active = z; - else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - stbtt__active_edge *p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - } - ++e; - } - - // now process all active edges in XOR fashion - if (active) - stbtt__fill_active_edges(scanline, result->w, active, max_weight); - - ++y; - } - STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} - -#elif STBTT_RASTERIZER_VERSION == 2 - -// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 -// (i.e. it has already been clipped to those) -static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) -{ - if (y0 == y1) return; - STBTT_assert(y0 < y1); - STBTT_assert(e->sy <= e->ey); - if (y0 > e->ey) return; - if (y1 < e->sy) return; - if (y0 < e->sy) { - x0 += (x1-x0) * (e->sy - y0) / (y1-y0); - y0 = e->sy; - } - if (y1 > e->ey) { - x1 += (x1-x0) * (e->ey - y1) / (y1-y0); - y1 = e->ey; - } - - if (x0 == x) - STBTT_assert(x1 <= x+1); - else if (x0 == x+1) - STBTT_assert(x1 >= x); - else if (x0 <= x) - STBTT_assert(x1 <= x); - else if (x0 >= x+1) - STBTT_assert(x1 >= x+1); - else - STBTT_assert(x1 >= x && x1 <= x+1); - - if (x0 <= x && x1 <= x) - scanline[x] += e->direction * (y1-y0); - else if (x0 >= x+1 && x1 >= x+1) - ; - else { - STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); - scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position - } -} - -static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) -{ - STBTT_assert(top_width >= 0); - STBTT_assert(bottom_width >= 0); - return (top_width + bottom_width) / 2.0f * height; -} - -static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) -{ - return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); -} - -static float stbtt__sized_triangle_area(float height, float width) -{ - return height * width / 2; -} - -static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) -{ - float y_bottom = y_top+1; - - while (e) { - // brute force every pixel - - // compute intersection points with top & bottom - STBTT_assert(e->ey >= y_top); - - if (e->fdx == 0) { - float x0 = e->fx; - if (x0 < len) { - if (x0 >= 0) { - stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); - stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); - } else { - stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); - } - } - } else { - float x0 = e->fx; - float dx = e->fdx; - float xb = x0 + dx; - float x_top, x_bottom; - float sy0,sy1; - float dy = e->fdy; - STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); - - // compute endpoints of line segment clipped to this scanline (if the - // line segment starts on this scanline. x0 is the intersection of the - // line with y_top, but that may be off the line segment. - if (e->sy > y_top) { - x_top = x0 + dx * (e->sy - y_top); - sy0 = e->sy; - } else { - x_top = x0; - sy0 = y_top; - } - if (e->ey < y_bottom) { - x_bottom = x0 + dx * (e->ey - y_top); - sy1 = e->ey; - } else { - x_bottom = xb; - sy1 = y_bottom; - } - - if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { - // from here on, we don't have to range check x values - - if ((int) x_top == (int) x_bottom) { - float height; - // simple case, only spans one pixel - int x = (int) x_top; - height = (sy1 - sy0) * e->direction; - STBTT_assert(x >= 0 && x < len); - scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); - scanline_fill[x] += height; // everything right of this pixel is filled - } else { - int x,x1,x2; - float y_crossing, y_final, step, sign, area; - // covers 2+ pixels - if (x_top > x_bottom) { - // flip scanline vertically; signed area is the same - float t; - sy0 = y_bottom - (sy0 - y_top); - sy1 = y_bottom - (sy1 - y_top); - t = sy0, sy0 = sy1, sy1 = t; - t = x_bottom, x_bottom = x_top, x_top = t; - dx = -dx; - dy = -dy; - t = x0, x0 = xb, xb = t; - } - STBTT_assert(dy >= 0); - STBTT_assert(dx >= 0); - - x1 = (int) x_top; - x2 = (int) x_bottom; - // compute intersection with y axis at x1+1 - y_crossing = y_top + dy * (x1+1 - x0); - - // compute intersection with y axis at x2 - y_final = y_top + dy * (x2 - x0); - - // x1 x_top x2 x_bottom - // y_top +------|-----+------------+------------+--------|---+------------+ - // | | | | | | - // | | | | | | - // sy0 | Txxxxx|............|............|............|............| - // y_crossing | *xxxxx.......|............|............|............| - // | | xxxxx..|............|............|............| - // | | /- xx*xxxx........|............|............| - // | | dy < | xxxxxx..|............|............| - // y_final | | \- | xx*xxx.........|............| - // sy1 | | | | xxxxxB...|............| - // | | | | | | - // | | | | | | - // y_bottom +------------+------------+------------+------------+------------+ - // - // goal is to measure the area covered by '.' in each pixel - - // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 - // @TODO: maybe test against sy1 rather than y_bottom? - if (y_crossing > y_bottom) - y_crossing = y_bottom; - - sign = e->direction; - - // area of the rectangle covered from sy0..y_crossing - area = sign * (y_crossing-sy0); - - // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) - scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); - - // check if final y_crossing is blown up; no test case for this - if (y_final > y_bottom) { - y_final = y_bottom; - dy = (y_final - y_crossing ) / (x2 - (x1+1)); // if denom=0, y_final = y_crossing, so y_final <= y_bottom - } - - // in second pixel, area covered by line segment found in first pixel - // is always a rectangle 1 wide * the height of that line segment; this - // is exactly what the variable 'area' stores. it also gets a contribution - // from the line segment within it. the THIRD pixel will get the first - // pixel's rectangle contribution, the second pixel's rectangle contribution, - // and its own contribution. the 'own contribution' is the same in every pixel except - // the leftmost and rightmost, a trapezoid that slides down in each pixel. - // the second pixel's contribution to the third pixel will be the - // rectangle 1 wide times the height change in the second pixel, which is dy. - - step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, - // which multiplied by 1-pixel-width is how much pixel area changes for each step in x - // so the area advances by 'step' every time - - for (x = x1+1; x < x2; ++x) { - scanline[x] += area + step/2; // area of trapezoid is 1*step/2 - area += step; - } - STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down - STBTT_assert(sy1 > y_final-0.01f); - - // area covered in the last pixel is the rectangle from all the pixels to the left, - // plus the trapezoid filled by the line segment in this pixel all the way to the right edge - scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); - - // the rest of the line is filled based on the total height of the line segment in this pixel - scanline_fill[x2] += sign * (sy1-sy0); - } - } else { - // if edge goes outside of box we're drawing, we require - // clipping logic. since this does not match the intended use - // of this library, we use a different, very slow brute - // force implementation - // note though that this does happen some of the time because - // x_top and x_bottom can be extrapolated at the top & bottom of - // the shape and actually lie outside the bounding box - int x; - for (x=0; x < len; ++x) { - // cases: - // - // there can be up to two intersections with the pixel. any intersection - // with left or right edges can be handled by splitting into two (or three) - // regions. intersections with top & bottom do not necessitate case-wise logic. - // - // the old way of doing this found the intersections with the left & right edges, - // then used some simple logic to produce up to three segments in sorted order - // from top-to-bottom. however, this had a problem: if an x edge was epsilon - // across the x border, then the corresponding y position might not be distinct - // from the other y segment, and it might ignored as an empty segment. to avoid - // that, we need to explicitly produce segments based on x positions. - - // rename variables to clearly-defined pairs - float y0 = y_top; - float x1 = (float) (x); - float x2 = (float) (x+1); - float x3 = xb; - float y3 = y_bottom; - - // x = e->x + e->dx * (y-y_top) - // (y-y_top) = (x - e->x) / e->dx - // y = (x - e->x) / e->dx + y_top - float y1 = (x - x0) / dx + y_top; - float y2 = (x+1 - x0) / dx + y_top; - - if (x0 < x1 && x3 > x2) { // three segments descending down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x1 && x0 > x2) { // three segments descending down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); - stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); - } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); - stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); - } else { // one segment - stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); - } - } - } - } - e = e->next; - } -} - -// directly AA rasterize edges w/o supersampling -static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) -{ - stbtt__hheap hh = { 0, 0, 0 }; - stbtt__active_edge *active = NULL; - int y,j=0, i; - float scanline_data[129], *scanline, *scanline2; - - STBTT__NOTUSED(vsubsample); - - if (result->w > 64) - scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); - else - scanline = scanline_data; - - scanline2 = scanline + result->w; - - y = off_y; - e[n].y0 = (float) (off_y + result->h) + 1; - - while (j < result->h) { - // find center of pixel for this scanline - float scan_y_top = y + 0.0f; - float scan_y_bottom = y + 1.0f; - stbtt__active_edge **step = &active; - - STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); - STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); - - // update all active edges; - // remove all active edges that terminate before the top of this scanline - while (*step) { - stbtt__active_edge * z = *step; - if (z->ey <= scan_y_top) { - *step = z->next; // delete from list - STBTT_assert(z->direction); - z->direction = 0; - stbtt__hheap_free(&hh, z); - } else { - step = &((*step)->next); // advance through list - } - } - - // insert all edges that start before the bottom of this scanline - while (e->y0 <= scan_y_bottom) { - if (e->y0 != e->y1) { - stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); - if (z != NULL) { - if (j == 0 && off_y != 0) { - if (z->ey < scan_y_top) { - // this can happen due to subpixel positioning and some kind of fp rounding error i think - z->ey = scan_y_top; - } - } - STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds - // insert at front - z->next = active; - active = z; - } - } - ++e; - } - - // now process all active edges - if (active) - stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); - - { - float sum = 0; - for (i=0; i < result->w; ++i) { - float k; - int m; - sum += scanline2[i]; - k = scanline[i] + sum; - k = (float) STBTT_fabs(k)*255 + 0.5f; - m = (int) k; - if (m > 255) m = 255; - result->pixels[j*result->stride + i] = (unsigned char) m; - } - } - // advance all the edges - step = &active; - while (*step) { - stbtt__active_edge *z = *step; - z->fx += z->fdx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - - ++y; - ++j; - } - - stbtt__hheap_cleanup(&hh, userdata); - - if (scanline != scanline_data) - STBTT_free(scanline, userdata); -} -#else -#error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - -#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) - -static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) -{ - int i,j; - for (i=1; i < n; ++i) { - stbtt__edge t = p[i], *a = &t; - j = i; - while (j > 0) { - stbtt__edge *b = &p[j-1]; - int c = STBTT__COMPARE(a,b); - if (!c) break; - p[j] = p[j-1]; - --j; - } - if (i != j) - p[j] = t; - } -} - -static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) -{ - /* threshold for transitioning to insertion sort */ - while (n > 12) { - stbtt__edge t; - int c01,c12,c,m,i,j; - - /* compute median of three */ - m = n >> 1; - c01 = STBTT__COMPARE(&p[0],&p[m]); - c12 = STBTT__COMPARE(&p[m],&p[n-1]); - /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ - if (c01 != c12) { - /* otherwise, we'll need to swap something else to middle */ - int z; - c = STBTT__COMPARE(&p[0],&p[n-1]); - /* 0>mid && midn => n; 0 0 */ - /* 0n: 0>n => 0; 0 n */ - z = (c == c12) ? 0 : n-1; - t = p[z]; - p[z] = p[m]; - p[m] = t; - } - /* now p[m] is the median-of-three */ - /* swap it to the beginning so it won't move around */ - t = p[0]; - p[0] = p[m]; - p[m] = t; - - /* partition loop */ - i=1; - j=n-1; - for(;;) { - /* handling of equality is crucial here */ - /* for sentinels & efficiency with duplicates */ - for (;;++i) { - if (!STBTT__COMPARE(&p[i], &p[0])) break; - } - for (;;--j) { - if (!STBTT__COMPARE(&p[0], &p[j])) break; - } - /* make sure we haven't crossed */ - if (i >= j) break; - t = p[i]; - p[i] = p[j]; - p[j] = t; - - ++i; - --j; - } - /* recurse on smaller side, iterate on larger */ - if (j < (n-i)) { - stbtt__sort_edges_quicksort(p,j); - p = p+i; - n = n-i; - } else { - stbtt__sort_edges_quicksort(p+i, n-i); - n = j; - } - } -} - -static void stbtt__sort_edges(stbtt__edge *p, int n) -{ - stbtt__sort_edges_quicksort(p, n); - stbtt__sort_edges_ins_sort(p, n); -} - -typedef struct -{ - float x,y; -} stbtt__point; - -static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) -{ - float y_scale_inv = invert ? -scale_y : scale_y; - stbtt__edge *e; - int n,i,j,k,m; -#if STBTT_RASTERIZER_VERSION == 1 - int vsubsample = result->h < 8 ? 15 : 5; -#elif STBTT_RASTERIZER_VERSION == 2 - int vsubsample = 1; -#else - #error "Unrecognized value of STBTT_RASTERIZER_VERSION" -#endif - // vsubsample should divide 255 evenly; otherwise we won't reach full opacity - - // now we have to blow out the windings into explicit edge lists - n = 0; - for (i=0; i < windings; ++i) - n += wcount[i]; - - e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel - if (e == 0) return; - n = 0; - - m=0; - for (i=0; i < windings; ++i) { - stbtt__point *p = pts + m; - m += wcount[i]; - j = wcount[i]-1; - for (k=0; k < wcount[i]; j=k++) { - int a=k,b=j; - // skip the edge if horizontal - if (p[j].y == p[k].y) - continue; - // add edge from j to k to the list - e[n].invert = 0; - if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { - e[n].invert = 1; - a=j,b=k; - } - e[n].x0 = p[a].x * scale_x + shift_x; - e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; - e[n].x1 = p[b].x * scale_x + shift_x; - e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; - ++n; - } - } - - // now sort the edges by their highest point (should snap to integer, and then by x) - //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); - stbtt__sort_edges(e, n); - - // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule - stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); - - STBTT_free(e, userdata); -} - -static void stbtt__add_point(stbtt__point *points, int n, float x, float y) -{ - if (!points) return; // during first pass, it's unallocated - points[n].x = x; - points[n].y = y; -} - -// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching -static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) -{ - // midpoint - float mx = (x0 + 2*x1 + x2)/4; - float my = (y0 + 2*y1 + y2)/4; - // versus directly drawn line - float dx = (x0+x2)/2 - mx; - float dy = (y0+y2)/2 - my; - if (n > 16) // 65536 segments on one curve better be enough! - return 1; - if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA - stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x2,y2); - *num_points = *num_points+1; - } - return 1; -} - -static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) -{ - // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough - float dx0 = x1-x0; - float dy0 = y1-y0; - float dx1 = x2-x1; - float dy1 = y2-y1; - float dx2 = x3-x2; - float dy2 = y3-y2; - float dx = x3-x0; - float dy = y3-y0; - float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); - float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); - float flatness_squared = longlen*longlen-shortlen*shortlen; - - if (n > 16) // 65536 segments on one curve better be enough! - return; - - if (flatness_squared > objspace_flatness_squared) { - float x01 = (x0+x1)/2; - float y01 = (y0+y1)/2; - float x12 = (x1+x2)/2; - float y12 = (y1+y2)/2; - float x23 = (x2+x3)/2; - float y23 = (y2+y3)/2; - - float xa = (x01+x12)/2; - float ya = (y01+y12)/2; - float xb = (x12+x23)/2; - float yb = (y12+y23)/2; - - float mx = (xa+xb)/2; - float my = (ya+yb)/2; - - stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); - stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); - } else { - stbtt__add_point(points, *num_points,x3,y3); - *num_points = *num_points+1; - } -} - -// returns number of contours -static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) -{ - stbtt__point *points=0; - int num_points=0; - - float objspace_flatness_squared = objspace_flatness * objspace_flatness; - int i,n=0,start=0, pass; - - // count how many "moves" there are to get the contour count - for (i=0; i < num_verts; ++i) - if (vertices[i].type == STBTT_vmove) - ++n; - - *num_contours = n; - if (n == 0) return 0; - - *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); - - if (*contour_lengths == 0) { - *num_contours = 0; - return 0; - } - - // make two passes through the points so we don't need to realloc - for (pass=0; pass < 2; ++pass) { - float x=0,y=0; - if (pass == 1) { - points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); - if (points == NULL) goto error; - } - num_points = 0; - n= -1; - for (i=0; i < num_verts; ++i) { - switch (vertices[i].type) { - case STBTT_vmove: - // start the next contour - if (n >= 0) - (*contour_lengths)[n] = num_points - start; - ++n; - start = num_points; - - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x,y); - break; - case STBTT_vline: - x = vertices[i].x, y = vertices[i].y; - stbtt__add_point(points, num_points++, x, y); - break; - case STBTT_vcurve: - stbtt__tesselate_curve(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - case STBTT_vcubic: - stbtt__tesselate_cubic(points, &num_points, x,y, - vertices[i].cx, vertices[i].cy, - vertices[i].cx1, vertices[i].cy1, - vertices[i].x, vertices[i].y, - objspace_flatness_squared, 0); - x = vertices[i].x, y = vertices[i].y; - break; - } - } - (*contour_lengths)[n] = num_points - start; - } - - return points; -error: - STBTT_free(points, userdata); - STBTT_free(*contour_lengths, userdata); - *contour_lengths = 0; - *num_contours = 0; - return NULL; -} - -STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) -{ - float scale = scale_x > scale_y ? scale_y : scale_x; - int winding_count = 0; - int *winding_lengths = NULL; - stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); - if (windings) { - stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); - STBTT_free(winding_lengths, userdata); - STBTT_free(windings, userdata); - } -} - -STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - int ix0,iy0,ix1,iy1; - stbtt__bitmap gbm; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - - if (scale_x == 0) scale_x = scale_y; - if (scale_y == 0) { - if (scale_x == 0) { - STBTT_free(vertices, info->userdata); - return NULL; - } - scale_y = scale_x; - } - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); - - // now we get the size - gbm.w = (ix1 - ix0); - gbm.h = (iy1 - iy0); - gbm.pixels = NULL; // in case we error - - if (width ) *width = gbm.w; - if (height) *height = gbm.h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - if (gbm.w && gbm.h) { - gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); - if (gbm.pixels) { - gbm.stride = gbm.w; - - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); - } - } - STBTT_free(vertices, info->userdata); - return gbm.pixels; -} - -STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) -{ - int ix0,iy0; - stbtt_vertex *vertices; - int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); - stbtt__bitmap gbm; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); - gbm.pixels = output; - gbm.w = out_w; - gbm.h = out_h; - gbm.stride = out_stride; - - if (gbm.w && gbm.h) - stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); - - STBTT_free(vertices, info->userdata); -} - -STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) -{ - stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); -} - -STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); -} - -STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) -{ - stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); -} - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-CRAPPY packing to keep source code small - -static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) - float pixel_height, // height of font in pixels - unsigned char *pixels, int pw, int ph, // bitmap to be filled in - int first_char, int num_chars, // characters to bake - stbtt_bakedchar *chardata) -{ - float scale; - int x,y,bottom_y, i; - stbtt_fontinfo f; - f.userdata = NULL; - if (!stbtt_InitFont(&f, data, offset)) - return -1; - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - x=y=1; - bottom_y = 1; - - scale = stbtt_ScaleForPixelHeight(&f, pixel_height); - - for (i=0; i < num_chars; ++i) { - int advance, lsb, x0,y0,x1,y1,gw,gh; - int g = stbtt_FindGlyphIndex(&f, first_char + i); - stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); - stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); - gw = x1-x0; - gh = y1-y0; - if (x + gw + 1 >= pw) - y = bottom_y, x = 1; // advance to next row - if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row - return -i; - STBTT_assert(x+gw < pw); - STBTT_assert(y+gh < ph); - stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); - chardata[i].x0 = (stbtt_int16) x; - chardata[i].y0 = (stbtt_int16) y; - chardata[i].x1 = (stbtt_int16) (x + gw); - chardata[i].y1 = (stbtt_int16) (y + gh); - chardata[i].xadvance = scale * advance; - chardata[i].xoff = (float) x0; - chardata[i].yoff = (float) y0; - x = x + gw + 1; - if (y+gh+1 > bottom_y) - bottom_y = y+gh+1; - } - return bottom_y; -} - -STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) -{ - float d3d_bias = opengl_fillrule ? 0 : -0.5f; - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_bakedchar *b = chardata + char_index; - int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); - int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); - - q->x0 = round_x + d3d_bias; - q->y0 = round_y + d3d_bias; - q->x1 = round_x + b->x1 - b->x0 + d3d_bias; - q->y1 = round_y + b->y1 - b->y0 + d3d_bias; - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// rectangle packing replacement routines if you don't have stb_rect_pack.h -// - -#ifndef STB_RECT_PACK_VERSION - -typedef int stbrp_coord; - -//////////////////////////////////////////////////////////////////////////////////// -// // -// // -// COMPILER WARNING ?!?!? // -// // -// // -// if you get a compile warning due to these symbols being defined more than // -// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // -// // -//////////////////////////////////////////////////////////////////////////////////// - -typedef struct -{ - int width,height; - int x,y,bottom_y; -} stbrp_context; - -typedef struct -{ - unsigned char x; -} stbrp_node; - -struct stbrp_rect -{ - stbrp_coord x,y; - int id,w,h,was_packed; -}; - -static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) -{ - con->width = pw; - con->height = ph; - con->x = 0; - con->y = 0; - con->bottom_y = 0; - STBTT__NOTUSED(nodes); - STBTT__NOTUSED(num_nodes); -} - -static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) -{ - int i; - for (i=0; i < num_rects; ++i) { - if (con->x + rects[i].w > con->width) { - con->x = 0; - con->y = con->bottom_y; - } - if (con->y + rects[i].h > con->height) - break; - rects[i].x = con->x; - rects[i].y = con->y; - rects[i].was_packed = 1; - con->x += rects[i].w; - if (con->y + rects[i].h > con->bottom_y) - con->bottom_y = con->y + rects[i].h; - } - for ( ; i < num_rects; ++i) - rects[i].was_packed = 0; -} -#endif - -////////////////////////////////////////////////////////////////////////////// -// -// bitmap baking -// -// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If -// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. - -STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) -{ - stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); - int num_nodes = pw - padding; - stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); - - if (context == NULL || nodes == NULL) { - if (context != NULL) STBTT_free(context, alloc_context); - if (nodes != NULL) STBTT_free(nodes , alloc_context); - return 0; - } - - spc->user_allocator_context = alloc_context; - spc->width = pw; - spc->height = ph; - spc->pixels = pixels; - spc->pack_info = context; - spc->nodes = nodes; - spc->padding = padding; - spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; - spc->h_oversample = 1; - spc->v_oversample = 1; - spc->skip_missing = 0; - - stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); - - if (pixels) - STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels - - return 1; -} - -STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) -{ - STBTT_free(spc->nodes , spc->user_allocator_context); - STBTT_free(spc->pack_info, spc->user_allocator_context); -} - -STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) -{ - STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); - STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); - if (h_oversample <= STBTT_MAX_OVERSAMPLE) - spc->h_oversample = h_oversample; - if (v_oversample <= STBTT_MAX_OVERSAMPLE) - spc->v_oversample = v_oversample; -} - -STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) -{ - spc->skip_missing = skip; -} - -#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) - -static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_w = w - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < h; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_w; ++i) { - total += pixels[i] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; - pixels[i] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < w; ++i) { - STBTT_assert(pixels[i] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i] = (unsigned char) (total / kernel_width); - } - - pixels += stride_in_bytes; - } -} - -static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) -{ - unsigned char buffer[STBTT_MAX_OVERSAMPLE]; - int safe_h = h - kernel_width; - int j; - STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze - for (j=0; j < w; ++j) { - int i; - unsigned int total; - STBTT_memset(buffer, 0, kernel_width); - - total = 0; - - // make kernel_width a constant in common cases so compiler can optimize out the divide - switch (kernel_width) { - case 2: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 2); - } - break; - case 3: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 3); - } - break; - case 4: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 4); - } - break; - case 5: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / 5); - } - break; - default: - for (i=0; i <= safe_h; ++i) { - total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; - buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - break; - } - - for (; i < h; ++i) { - STBTT_assert(pixels[i*stride_in_bytes] == 0); - total -= buffer[i & STBTT__OVER_MASK]; - pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); - } - - pixels += 1; - } -} - -static float stbtt__oversample_shift(int oversample) -{ - if (!oversample) - return 0.0f; - - // The prefilter is a box filter of width "oversample", - // which shifts phase by (oversample - 1)/2 pixels in - // oversampled space. We want to shift in the opposite - // direction to counter this. - return (float)-(oversample - 1) / (2.0f * (float)oversample); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k; - int missing_glyph_added = 0; - - k=0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - ranges[i].h_oversample = (unsigned char) spc->h_oversample; - ranges[i].v_oversample = (unsigned char) spc->v_oversample; - for (j=0; j < ranges[i].num_chars; ++j) { - int x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { - rects[k].w = rects[k].h = 0; - } else { - stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - &x0,&y0,&x1,&y1); - rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); - rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); - if (glyph == 0) - missing_glyph_added = 1; - } - ++k; - } - } - - return k; -} - -STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) -{ - stbtt_MakeGlyphBitmapSubpixel(info, - output, - out_w - (prefilter_x - 1), - out_h - (prefilter_y - 1), - out_stride, - scale_x, - scale_y, - shift_x, - shift_y, - glyph); - - if (prefilter_x > 1) - stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); - - if (prefilter_y > 1) - stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); - - *sub_x = stbtt__oversample_shift(prefilter_x); - *sub_y = stbtt__oversample_shift(prefilter_y); -} - -// rects array must be big enough to accommodate all characters in the given ranges -STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) -{ - int i,j,k, missing_glyph = -1, return_value = 1; - - // save current values - int old_h_over = spc->h_oversample; - int old_v_over = spc->v_oversample; - - k = 0; - for (i=0; i < num_ranges; ++i) { - float fh = ranges[i].font_size; - float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); - float recip_h,recip_v,sub_x,sub_y; - spc->h_oversample = ranges[i].h_oversample; - spc->v_oversample = ranges[i].v_oversample; - recip_h = 1.0f / spc->h_oversample; - recip_v = 1.0f / spc->v_oversample; - sub_x = stbtt__oversample_shift(spc->h_oversample); - sub_y = stbtt__oversample_shift(spc->v_oversample); - for (j=0; j < ranges[i].num_chars; ++j) { - stbrp_rect *r = &rects[k]; - if (r->was_packed && r->w != 0 && r->h != 0) { - stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; - int advance, lsb, x0,y0,x1,y1; - int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; - int glyph = stbtt_FindGlyphIndex(info, codepoint); - stbrp_coord pad = (stbrp_coord) spc->padding; - - // pad on left and top - r->x += pad; - r->y += pad; - r->w -= pad; - r->h -= pad; - stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); - stbtt_GetGlyphBitmapBox(info, glyph, - scale * spc->h_oversample, - scale * spc->v_oversample, - &x0,&y0,&x1,&y1); - stbtt_MakeGlyphBitmapSubpixel(info, - spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w - spc->h_oversample+1, - r->h - spc->v_oversample+1, - spc->stride_in_bytes, - scale * spc->h_oversample, - scale * spc->v_oversample, - 0,0, - glyph); - - if (spc->h_oversample > 1) - stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->h_oversample); - - if (spc->v_oversample > 1) - stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, - r->w, r->h, spc->stride_in_bytes, - spc->v_oversample); - - bc->x0 = (stbtt_int16) r->x; - bc->y0 = (stbtt_int16) r->y; - bc->x1 = (stbtt_int16) (r->x + r->w); - bc->y1 = (stbtt_int16) (r->y + r->h); - bc->xadvance = scale * advance; - bc->xoff = (float) x0 * recip_h + sub_x; - bc->yoff = (float) y0 * recip_v + sub_y; - bc->xoff2 = (x0 + r->w) * recip_h + sub_x; - bc->yoff2 = (y0 + r->h) * recip_v + sub_y; - - if (glyph == 0) - missing_glyph = j; - } else if (spc->skip_missing) { - return_value = 0; - } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { - ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; - } else { - return_value = 0; // if any fail, report failure - } - - ++k; - } - } - - // restore original values - spc->h_oversample = old_h_over; - spc->v_oversample = old_v_over; - - return return_value; -} - -STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) -{ - stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); -} - -STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) -{ - stbtt_fontinfo info; - int i,j,n, return_value = 1; - //stbrp_context *context = (stbrp_context *) spc->pack_info; - stbrp_rect *rects; - - // flag all characters as NOT packed - for (i=0; i < num_ranges; ++i) - for (j=0; j < ranges[i].num_chars; ++j) - ranges[i].chardata_for_range[j].x0 = - ranges[i].chardata_for_range[j].y0 = - ranges[i].chardata_for_range[j].x1 = - ranges[i].chardata_for_range[j].y1 = 0; - - n = 0; - for (i=0; i < num_ranges; ++i) - n += ranges[i].num_chars; - - rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); - if (rects == NULL) - return 0; - - info.userdata = spc->user_allocator_context; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); - - n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); - - stbtt_PackFontRangesPackRects(spc, rects, n); - - return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); - - STBTT_free(rects, spc->user_allocator_context); - return return_value; -} - -STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, - int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) -{ - stbtt_pack_range range; - range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; - range.array_of_unicode_codepoints = NULL; - range.num_chars = num_chars_in_range; - range.chardata_for_range = chardata_for_range; - range.font_size = font_size; - return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); -} - -STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) -{ - int i_ascent, i_descent, i_lineGap; - float scale; - stbtt_fontinfo info; - stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); - scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); - stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); - *ascent = (float) i_ascent * scale; - *descent = (float) i_descent * scale; - *lineGap = (float) i_lineGap * scale; -} - -STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) -{ - float ipw = 1.0f / pw, iph = 1.0f / ph; - const stbtt_packedchar *b = chardata + char_index; - - if (align_to_integer) { - float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); - float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); - q->x0 = x; - q->y0 = y; - q->x1 = x + b->xoff2 - b->xoff; - q->y1 = y + b->yoff2 - b->yoff; - } else { - q->x0 = *xpos + b->xoff; - q->y0 = *ypos + b->yoff; - q->x1 = *xpos + b->xoff2; - q->y1 = *ypos + b->yoff2; - } - - q->s0 = b->x0 * ipw; - q->t0 = b->y0 * iph; - q->s1 = b->x1 * ipw; - q->t1 = b->y1 * iph; - - *xpos += b->xadvance; -} - -////////////////////////////////////////////////////////////////////////////// -// -// sdf computation -// - -#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) -#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) - -static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) -{ - float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; - float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; - float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; - float roperp = orig[1]*ray[0] - orig[0]*ray[1]; - - float a = q0perp - 2*q1perp + q2perp; - float b = q1perp - q0perp; - float c = q0perp - roperp; - - float s0 = 0., s1 = 0.; - int num_s = 0; - - if (a != 0.0) { - float discr = b*b - a*c; - if (discr > 0.0) { - float rcpna = -1 / a; - float d = (float) STBTT_sqrt(discr); - s0 = (b+d) * rcpna; - s1 = (b-d) * rcpna; - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { - if (num_s == 0) s0 = s1; - ++num_s; - } - } - } else { - // 2*b*s + c = 0 - // s = -c / (2*b) - s0 = c / (-2 * b); - if (s0 >= 0.0 && s0 <= 1.0) - num_s = 1; - } - - if (num_s == 0) - return 0; - else { - float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); - float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; - - float q0d = q0[0]*rayn_x + q0[1]*rayn_y; - float q1d = q1[0]*rayn_x + q1[1]*rayn_y; - float q2d = q2[0]*rayn_x + q2[1]*rayn_y; - float rod = orig[0]*rayn_x + orig[1]*rayn_y; - - float q10d = q1d - q0d; - float q20d = q2d - q0d; - float q0rd = q0d - rod; - - hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; - hits[0][1] = a*s0+b; - - if (num_s > 1) { - hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; - hits[1][1] = a*s1+b; - return 2; - } else { - return 1; - } - } -} - -static int equal(float *a, float *b) -{ - return (a[0] == b[0] && a[1] == b[1]); -} - -static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) -{ - int i; - float orig[2], ray[2] = { 1, 0 }; - float y_frac; - int winding = 0; - - // make sure y never passes through a vertex of the shape - y_frac = (float) STBTT_fmod(y, 1.0f); - if (y_frac < 0.01f) - y += 0.01f; - else if (y_frac > 0.99f) - y -= 0.01f; - - orig[0] = x; - orig[1] = y; - - // test a ray from (-infinity,y) to (x,y) - for (i=0; i < nverts; ++i) { - if (verts[i].type == STBTT_vline) { - int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; - int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } - if (verts[i].type == STBTT_vcurve) { - int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; - int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; - int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; - int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); - int by = STBTT_max(y0,STBTT_max(y1,y2)); - if (y > ay && y < by && x > ax) { - float q0[2],q1[2],q2[2]; - float hits[2][2]; - q0[0] = (float)x0; - q0[1] = (float)y0; - q1[0] = (float)x1; - q1[1] = (float)y1; - q2[0] = (float)x2; - q2[1] = (float)y2; - if (equal(q0,q1) || equal(q1,q2)) { - x0 = (int)verts[i-1].x; - y0 = (int)verts[i-1].y; - x1 = (int)verts[i ].x; - y1 = (int)verts[i ].y; - if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { - float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; - if (x_inter < x) - winding += (y0 < y1) ? 1 : -1; - } - } else { - int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); - if (num_hits >= 1) - if (hits[0][0] < 0) - winding += (hits[0][1] < 0 ? -1 : 1); - if (num_hits >= 2) - if (hits[1][0] < 0) - winding += (hits[1][1] < 0 ? -1 : 1); - } - } - } - } - return winding; -} - -static float stbtt__cuberoot( float x ) -{ - if (x<0) - return -(float) STBTT_pow(-x,1.0f/3.0f); - else - return (float) STBTT_pow( x,1.0f/3.0f); -} - -// x^3 + a*x^2 + b*x + c = 0 -static int stbtt__solve_cubic(float a, float b, float c, float* r) -{ - float s = -a / 3; - float p = b - a*a / 3; - float q = a * (2*a*a - 9*b) / 27 + c; - float p3 = p*p*p; - float d = q*q + 4*p3 / 27; - if (d >= 0) { - float z = (float) STBTT_sqrt(d); - float u = (-q + z) / 2; - float v = (-q - z) / 2; - u = stbtt__cuberoot(u); - v = stbtt__cuberoot(v); - r[0] = s + u + v; - return 1; - } else { - float u = (float) STBTT_sqrt(-p/3); - float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative - float m = (float) STBTT_cos(v); - float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; - r[0] = s + u * 2 * m; - r[1] = s - u * (m + n); - r[2] = s - u * (m - n); - - //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? - //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); - //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); - return 3; - } -} - -STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - float scale_x = scale, scale_y = scale; - int ix0,iy0,ix1,iy1; - int w,h; - unsigned char *data; - - if (scale == 0) return NULL; - - stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); - - // if empty, return NULL - if (ix0 == ix1 || iy0 == iy1) - return NULL; - - ix0 -= padding; - iy0 -= padding; - ix1 += padding; - iy1 += padding; - - w = (ix1 - ix0); - h = (iy1 - iy0); - - if (width ) *width = w; - if (height) *height = h; - if (xoff ) *xoff = ix0; - if (yoff ) *yoff = iy0; - - // invert for y-downwards bitmaps - scale_y = -scale_y; - - { - int x,y,i,j; - float *precompute; - stbtt_vertex *verts; - int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); - data = (unsigned char *) STBTT_malloc(w * h, info->userdata); - precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); - - for (i=0,j=num_verts-1; i < num_verts; j=i++) { - if (verts[i].type == STBTT_vline) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; - float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); - precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; - float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; - float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float len2 = bx*bx + by*by; - if (len2 != 0.0f) - precompute[i] = 1.0f / (bx*bx + by*by); - else - precompute[i] = 0.0f; - } else - precompute[i] = 0.0f; - } - - for (y=iy0; y < iy1; ++y) { - for (x=ix0; x < ix1; ++x) { - float val; - float min_dist = 999999.0f; - float sx = (float) x + 0.5f; - float sy = (float) y + 0.5f; - float x_gspace = (sx / scale_x); - float y_gspace = (sy / scale_y); - - int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path - - for (i=0; i < num_verts; ++i) { - float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; - - if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { - float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; - - float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - // coarse culling against bbox - //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && - // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) - dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; - STBTT_assert(i != 0); - if (dist < min_dist) { - // check position along line - // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) - // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) - float dx = x1-x0, dy = y1-y0; - float px = x0-sx, py = y0-sy; - // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy - // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve - float t = -(px*dx + py*dy) / (dx*dx + dy*dy); - if (t >= 0.0f && t <= 1.0f) - min_dist = dist; - } - } else if (verts[i].type == STBTT_vcurve) { - float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; - float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; - float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); - float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); - float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); - float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); - // coarse culling against bbox to avoid computing cubic unnecessarily - if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { - int num=0; - float ax = x1-x0, ay = y1-y0; - float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; - float mx = x0 - sx, my = y0 - sy; - float res[3] = {0.f,0.f,0.f}; - float px,py,t,it,dist2; - float a_inv = precompute[i]; - if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula - float a = 3*(ax*bx + ay*by); - float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); - float c = mx*ax+my*ay; - if (a == 0.0) { // if a is 0, it's linear - if (b != 0.0) { - res[num++] = -c/b; - } - } else { - float discriminant = b*b - 4*a*c; - if (discriminant < 0) - num = 0; - else { - float root = (float) STBTT_sqrt(discriminant); - res[0] = (-b - root)/(2*a); - res[1] = (-b + root)/(2*a); - num = 2; // don't bother distinguishing 1-solution case, as code below will still work - } - } - } else { - float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point - float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; - float d = (mx*ax+my*ay) * a_inv; - num = stbtt__solve_cubic(b, c, d, res); - } - dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); - if (dist2 < min_dist*min_dist) - min_dist = (float) STBTT_sqrt(dist2); - - if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { - t = res[0], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { - t = res[1], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { - t = res[2], it = 1.0f - t; - px = it*it*x0 + 2*t*it*x1 + t*t*x2; - py = it*it*y0 + 2*t*it*y1 + t*t*y2; - dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); - if (dist2 < min_dist * min_dist) - min_dist = (float) STBTT_sqrt(dist2); - } - } - } - } - if (winding == 0) - min_dist = -min_dist; // if outside the shape, value is negative - val = onedge_value + pixel_dist_scale * min_dist; - if (val < 0) - val = 0; - else if (val > 255) - val = 255; - data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; - } - } - STBTT_free(precompute, info->userdata); - STBTT_free(verts, info->userdata); - } - return data; -} - -STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) -{ - return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); -} - -STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) -{ - STBTT_free(bitmap, userdata); -} - -////////////////////////////////////////////////////////////////////////////// -// -// font name matching -- recommended not to use this -// - -// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string -static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) -{ - stbtt_int32 i=0; - - // convert utf16 to utf8 and compare the results while converting - while (len2) { - stbtt_uint16 ch = s2[0]*256 + s2[1]; - if (ch < 0x80) { - if (i >= len1) return -1; - if (s1[i++] != ch) return -1; - } else if (ch < 0x800) { - if (i+1 >= len1) return -1; - if (s1[i++] != 0xc0 + (ch >> 6)) return -1; - if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; - } else if (ch >= 0xd800 && ch < 0xdc00) { - stbtt_uint32 c; - stbtt_uint16 ch2 = s2[2]*256 + s2[3]; - if (i+3 >= len1) return -1; - c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; - if (s1[i++] != 0xf0 + (c >> 18)) return -1; - if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; - s2 += 2; // plus another 2 below - len2 -= 2; - } else if (ch >= 0xdc00 && ch < 0xe000) { - return -1; - } else { - if (i+2 >= len1) return -1; - if (s1[i++] != 0xe0 + (ch >> 12)) return -1; - if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; - if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; - } - s2 += 2; - len2 -= 2; - } - return i; -} - -static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) -{ - return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); -} - -// returns results in whatever encoding you request... but note that 2-byte encodings -// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare -STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) -{ - stbtt_int32 i,count,stringOffset; - stbtt_uint8 *fc = font->data; - stbtt_uint32 offset = font->fontstart; - stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return NULL; - - count = ttUSHORT(fc+nm+2); - stringOffset = nm + ttUSHORT(fc+nm+4); - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) - && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { - *length = ttUSHORT(fc+loc+8); - return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); - } - } - return NULL; -} - -static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) -{ - stbtt_int32 i; - stbtt_int32 count = ttUSHORT(fc+nm+2); - stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); - - for (i=0; i < count; ++i) { - stbtt_uint32 loc = nm + 6 + 12 * i; - stbtt_int32 id = ttUSHORT(fc+loc+6); - if (id == target_id) { - // find the encoding - stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); - - // is this a Unicode encoding? - if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { - stbtt_int32 slen = ttUSHORT(fc+loc+8); - stbtt_int32 off = ttUSHORT(fc+loc+10); - - // check if there's a prefix match - stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); - if (matchlen >= 0) { - // check for target_id+1 immediately following, with same encoding & language - if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { - slen = ttUSHORT(fc+loc+12+8); - off = ttUSHORT(fc+loc+12+10); - if (slen == 0) { - if (matchlen == nlen) - return 1; - } else if (matchlen < nlen && name[matchlen] == ' ') { - ++matchlen; - if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) - return 1; - } - } else { - // if nothing immediately following - if (matchlen == nlen) - return 1; - } - } - } - - // @TODO handle other encodings - } - } - return 0; -} - -static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) -{ - stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); - stbtt_uint32 nm,hd; - if (!stbtt__isfont(fc+offset)) return 0; - - // check italics/bold/underline flags in macStyle... - if (flags) { - hd = stbtt__find_table(fc, offset, "head"); - if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; - } - - nm = stbtt__find_table(fc, offset, "name"); - if (!nm) return 0; - - if (flags) { - // if we checked the macStyle flags, then just check the family and ignore the subfamily - if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } else { - if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; - if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; - } - - return 0; -} - -static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) -{ - stbtt_int32 i; - for (i=0;;++i) { - stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); - if (off < 0) return off; - if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) - return off; - } -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wcast-qual" -#endif - -STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, - float pixel_height, unsigned char *pixels, int pw, int ph, - int first_char, int num_chars, stbtt_bakedchar *chardata) -{ - return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); -} - -STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) -{ - return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); -} - -STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) -{ - return stbtt_GetNumberOfFonts_internal((unsigned char *) data); -} - -STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) -{ - return stbtt_InitFont_internal(info, (unsigned char *) data, offset); -} - -STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) -{ - return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); -} - -STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) -{ - return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); -} - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#endif // STB_TRUETYPE_IMPLEMENTATION - - -// FULL VERSION HISTORY -// -// 1.25 (2021-07-11) many fixes -// 1.24 (2020-02-05) fix warning -// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) -// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined -// 1.21 (2019-02-25) fix warning -// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() -// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod -// 1.18 (2018-01-29) add missing function -// 1.17 (2017-07-23) make more arguments const; doc fix -// 1.16 (2017-07-12) SDF support -// 1.15 (2017-03-03) make more arguments const -// 1.14 (2017-01-16) num-fonts-in-TTC function -// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts -// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual -// 1.11 (2016-04-02) fix unused-variable warning -// 1.10 (2016-04-02) allow user-defined fabs() replacement -// fix memory leak if fontsize=0.0 -// fix warning from duplicate typedef -// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges -// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges -// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; -// allow PackFontRanges to pack and render in separate phases; -// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); -// fixed an assert() bug in the new rasterizer -// replace assert() with STBTT_assert() in new rasterizer -// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) -// also more precise AA rasterizer, except if shapes overlap -// remove need for STBTT_sort -// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC -// 1.04 (2015-04-15) typo in example -// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes -// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ -// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match -// non-oversampled; STBTT_POINT_SIZE for packed case only -// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling -// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) -// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID -// 0.8b (2014-07-07) fix a warning -// 0.8 (2014-05-25) fix a few more warnings -// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back -// 0.6c (2012-07-24) improve documentation -// 0.6b (2012-07-20) fix a few more warnings -// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, -// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty -// 0.5 (2011-12-09) bugfixes: -// subpixel glyph renderer computed wrong bounding box -// first vertex of shape can be off-curve (FreeSans) -// 0.4b (2011-12-03) fixed an error in the font baking example -// 0.4 (2011-12-01) kerning, subpixel rendering (tor) -// bugfixes for: -// codepoint-to-glyph conversion using table fmt=12 -// codepoint-to-glyph conversion using table fmt=4 -// stbtt_GetBakedQuad with non-square texture (Zer) -// updated Hello World! sample to use kerning and subpixel -// fixed some warnings -// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) -// userdata, malloc-from-userdata, non-zero fill (stb) -// 0.2 (2009-03-11) Fix unsigned/signed char warnings -// 0.1 (2009-03-09) First public 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. ------------------------------------------------------------------------------- -*/ \ No newline at end of file diff --git a/modules/stb_truetype/stb_truetype.so b/modules/stb_truetype/stb_truetype.so deleted file mode 100755 index 1d31289d..00000000 Binary files a/modules/stb_truetype/stb_truetype.so and /dev/null differ diff --git a/scripts/onyx-pkg.onyx b/scripts/onyx-pkg.onyx index 5f5746dd..e66640cb 100644 --- a/scripts/onyx-pkg.onyx +++ b/scripts/onyx-pkg.onyx @@ -291,6 +291,10 @@ run_sync_command :: (args: [] cstr) { uninstall_package(.{it.key, it.value}); dependencies_installed->delete(it.key); dependencies_to_install << .{ .{it.key, it.value}, false }; + + } elseif !it.value->is_compatible(dependencies_installed[it.key]) { + eprintf("Different major versions of {} being used!\n", it.key); + os.exit(1); } } else { dependencies_to_install << .{ .{it.key, it.value}, false };